C++ STL容器与函数谓词示例分析讲解

   2023-02-09 学习力0
核心提示:目录1.C++ vector向量2.C++ stack 栈3.C++ queue 队列4.优先级队列5.C++ list6.c++ set 集合7.C++ map函数8.C++ multimap容器9.C++ 谓词10.C++内置预定义函数C++ STL(Standard Template Library标准模板库),相当于java的集合模块, STL 有很多的容器。1.C+

C++ STL(Standard Template Library标准模板库),相当于java的集合模块, STL 有很多的容器。

1.C++ vector向量

(内部:封装动态大小数组作为容器,能够存放任意的动态数组)

#include <iostream>
#include <vector> // 引入 vector 容器的支持
// NDK 开发 一定要用容器  应该 queue 队列
using namespace std;
int main() {
    vector<int> vector1;
    vector<int> vector2(10); // 指定10的空间大小
    vector<int> vector3(10, 0); // 有了10个值了 每个值都是0
    vector<int> vector4;
    // 插入数据
    vector4.insert(vector4.begin(), 40);
    vector4.insert(vector4.begin(), 60);
    vector4.insert(vector4.begin(), 80);
    // 第一个
    cout << " 修改前:vector4.front():" << vector4.front() << endl;
    vector4.front() = 99; // 默认修改第一个
    cout << " 修改后:vector4.front():" << vector4.front() << endl;
    // 最后一个
    cout << " 修改前:vector4.back():" << vector4.back() << endl;
    vector4.back() = 777; // 默认修改最后
    cout << " 修改后:vector4.back():" << vector4.back() << endl;
    vector4.erase(vector4.begin()); // 移除第一个元素(内部:通过迭代器的位置 进行移除)  删除
    // 循环打印,默认 从大到小输出
    for (int i = 0; i < vector4.size(); ++i) {
        cout << "item:" << vector4[i] << endl;
    }
    // 迭代器 循环遍历
    // auto Kotlin自带类型推到
    // for (vector<int>::iterator iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
    for (auto iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
        // 迭代器 当中指针操作  iteratorVar++
        cout << "迭代器:" << *iteratorVar << endl;
    }
    cout << "" << endl;
    return 0;
}
  • vector4.begin() 迭代器 插入到前面
  • vector4.end() 迭代器 插入到后面

2.C++ stack 栈

#include <stack>
using namespace std;
int main() {
    stack<int> stackVar;
    stackVar.push(30);
    stackVar.push(60);
    stackVar.push(90);
    while (!stackVar.empty()) {
        int top = stackVar.top(); // top == 获取栈顶的元素
        cout << "获取栈顶的元素:" << top << endl; // 永远拿 90
        stackVar.pop(); // 把栈顶的元素 弹出去  【删除】
    }
    return 0;
}

栈没有迭代器,不能指定位置压栈等

3.C++ queue 队列

#include <queue>using namespace std;int main() {    queue<int> queueVar;    queueVar.push(20);    queueVar.push(40);    queueVar.push(60);    // 第一个元素    cout << " 修改前: queueVar.front():" << queueVar.front() << endl;    queueVar.front() = 88;    cout << " 修改后: queueVar.front():" << queueVar.front() << endl;    // 最后一个    cout << " 修改前: queueVar.back():" << queueVar.back() << endl;    queueVar.back() =99;    cout << " 修改后: queueVar.back():" << queueVar.back() << endl;    while (!queueVar.empty()) {        cout << "while1:" << queueVar.front() << endl;        queueVar.pop(); // 把前面的元素 给消费掉  【删除】    }    return 0;}

queue队列内部是通过数组和链表实现的,这个数据结构应用场景比较多,音视频编解码啥的都会用到,遵守FIFO 原则。

4.优先级队列

#include <iostream>#include <queue>using namespace std;int main() {       // priority_queue<int> priorityQueue;    priority_queue<int ,vector<int>, less<int>> priorityQueue;    priorityQueue.push(10);    priorityQueue.push(20);    priorityQueue.push(30);    priorityQueue.push(100);    priorityQueue.push(50);    priorityQueue.push(60);    cout << priorityQueue.top() << endl; // 60    // 循环代码    while (!priorityQueue.empty()) {        cout << "while1:" << priorityQueue.top() << endl;         priorityQueue.pop(); // 最前面的元素消费掉    }    return 0;}
  • priority_queue 内部对我们前面的vector 有一定的封装
  • 优先级队列会自动进行排序操作
  • priority_queue priorityQueue:这样声明优先级队列,相当于priority_queue<int ,vector, less> priorityQueue,省略了比较策略等
  • less return __x < __y: 从大到小
  • greater return __x > __y: 从小到大

5.C++ list

#include <iostream>#include <list>using namespace std;int main() {    list<char*> listVar;    // 插入操作    listVar.push_front("唐三"); // 插入到前面   明确    listVar.push_back("小舞"); // 插入到后面    listVar.insert(listVar.begin(),"宁荣荣"); // 插入到前面  灵活    listVar.insert(listVar.end(), "马红俊"); // 插入到后面//    // 修改操作//    listVar.back() = 88;//    listVar.front() = 55;//    // 删除//    listVar.erase(listVar.begin()); // 删除最前面的 55//    listVar.erase(listVar.end()); // 删除最后面的 88    for (auto it = listVar.begin(); it != listVar.end() ; it ++) {        cout << *it << endl;    }    return 0;}
  • Java:ArrayList采用Object[]数组, C++的list 内部:采用链表
  • 不用通过角标去访问、修改 、遍历

6.c++ set 集合

#include <iostream>#include <set>using namespace std;int main() {    set<int, less<int>> setVar;        setVar.insert(1);    setVar.insert(3);    setVar.insert(2);    setVar.insert(4);    pair<set<int, less<int>>::iterator, bool> res = setVar.insert(4);        bool insert_success = res.second;    if (insert_success) {        cout << "插入成功" << endl;    } else {        cout << "插入失败" << endl;    }        for (auto it = setVar.begin(); it != setVar.end() ; it ++) {        cout << *it << endl;    }    return 0;}
  • set(内部:红黑树结构),会对你存入的数据进行排序,不允许元素相同
  • __x < __y 从小到大,默认情况下 就是 less
  • 添加参数,不需要用迭代器,也不需要指定位置
  • 重复插入,会提示插入失败

7.C++ map函数

#include <iostream>#include <map>using namespace std;int main() {        // 注意:map会对key进行排序,默认 key不能重复    map<int, string> mapVar;    // TODO 添加数据    // 第一种方式    mapVar.insert(pair<int, string>(1, "唐三"));    // 第二种方式    mapVar.insert(make_pair(2, "小舞"));    // 第三种方式    mapVar.insert(map<int, string>::value_type (3, "宁荣荣"));    // 上面三种方式 key不能重复    // 思考:既然会对key进行排序,那么key是不能重复的(会插入失败)    std::pair<map<int,string>::iterator ,bool> r=mapVar.insert(pair<int, string>(3, "宁荣荣2"));   // 注意这个方式是插入失败了    //通过pair的方式    if (r.second){        cout << "插入成功" << endl;    }else{        cout << "插入失败" << endl;    }    // 第四种方式    mapVar[key]=Value    mapVar[4] = "马红俊";    mapVar[4] = "比比东"; // 第四种方式覆盖/替换(常用)    /**     *  typedef typename _Rep_type::iterator       iterator;  之前常规的迭代器        typedef typename _Rep_type::const_iterator  const_iterator;  只读的,只能读,不能修改 的迭代器        typedef typename _Rep_type::reverse_iterator    reverse_iterator;  倒序打印的迭代器     */    // 循环打印,迭代器    for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {        cout << it->first << "," << it->second.c_str() << "\t";    }    cout << endl;    // 查找,操作    map<int, string> ::iterator findResult = mapVar.find(3); // 查找    if (findResult != mapVar.end()) {        cout << "恭喜,找到了" << findResult->first << "," << findResult->second.c_str() << endl;    } else {        cout << "没找到了" << endl;    }    //删除元素    mapVar.erase(5);    //如果删除的元素不存在  也不会报错    // 循环打印,迭代器    for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {        cout << it->first << "," << it->second.c_str() << "\t";    }    cout << endl;    return 0;}
  • 通过pair 插入数据如果id重复会插入失败,不会覆盖
  • 通过mapVar[4] = "马红俊"这个方式插入数据,如果id重复会进行覆盖
  • 通过erase函数删除元素,如果id不存在不会报错

8.C++ multimap容器

#include <iostream>#include <map>using namespace std;int main() {    multimap<int, string> multimapVar;    multimapVar.insert(make_pair(10, "十个1"));    multimapVar.insert(make_pair(10, "十个2"));    multimapVar.insert(make_pair(10, "十个3"));    multimapVar.insert(make_pair(30, "三十1"));    multimapVar.insert(make_pair(30, "三十3"));    multimapVar.insert(make_pair(30, "三十2"));    multimapVar.insert(make_pair(20, "二十1"));    multimapVar.insert(make_pair(20, "二十2"));    multimapVar.insert(make_pair(20, "二十3"));    for (auto iteratorVar = multimapVar.begin(); iteratorVar != multimapVar.end() ; iteratorVar ++) {        cout << iteratorVar->first << "," << iteratorVar->second << endl;    }    cout << endl;    int result;    cout << "请输入你要查询的key,为int类型:" << endl;    cin >> result;    multimap<int, string>::iterator iteratorVar = multimapVar.find(result);    while (iteratorVar != multimapVar.end()) {        cout << iteratorVar->first << "," << iteratorVar->second << endl;                iteratorVar++;        if (iteratorVar->first != result) {            break;;        }//        if (iteratorVar == multimapVar.end()) {//            break;//        }    }    return 0;}
  • multimap核心功能是分组
  • multimap key可以重复,key重复的数据可以分组,key会自动进行排序

9.C++ 谓词

c++ 谓词 概念: 返回bool类型的仿函数称为谓词 。

如果operator()接受一个参数,那么叫做一元谓词 如果operator()接受两个参数,那么叫做二元谓词。

#include <iostream>
#include <set>
using namespace std;
class Person {
public:
    string name;
    int id;
    Person(string name, int id) : name(name), id(id) {}
};
// 自定义谓词 (仿函数)
struct doCompareAction2 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id < __y.id;
    }
};
struct doCompareAction3 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id > __y.id;
    }
};
int main() {
    set<Person, doCompareAction2> setVar;
    // set<Person, doCompareAction3> setVar;
    // 构建对象
    Person p1 ("Snake", 1);
    Person p2 ("kevin", 2);
    Person p3 ("Derry", 3);
    // 把构建的对象 插入到 set 容器里面去
    setVar.insert(p1);
    setVar.insert(p2);
    setVar.insert(p3);
    for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << it->name.c_str() << " , " << it->id << endl;
    }
    return 0;
}
  • c++ Set集合,默认的谓词不能对对象类型的比较,如果set集合传入对象类型需要自定义谓词来处理
  • 谓词定义的规则:定义一个结构体,bool operator() 这部分是固定格式 参数部分是两个常量引用类型数据,返回比较两个对象的维度就可以

10.C++内置预定义函数

// C++ 预定义函数(C++ 内置函数)
#include <iostream>
using namespace std;
int main() {
    // "Derry" + "AAAA" // 运算符重载
    // C++已经提供了 预定义函数  plus,minus,multiplies,divides,modulus ...
    plus<int> add_func;
    int r = add_func(1, 1);
    cout << r << endl;
    plus<string> add_func2;
    string r2 = add_func2("AAAA", "BBB");
    cout << r2 << endl;
    plus<float> add_func3;
    float r3 = add_func3(4354.45f, 34.3f);
    cout << r3 << endl;
    return 0;
}
原文地址:https://blog.csdn.net/u014078003/article/details/126290349
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Aurelius vs mORMot vs EntityDAC Delphi 的
    Aurelius vs mORMot vs EntityDAC   Delphi 的 ORM框架:http://www.tmssoftware.com/site/aurelius.asp#product-buy-onlinehttps://synopse.info/fossil/wiki/Synopse+OpenSourcehttps://www.devart.com/entitydac/download.htmlkbmMW  http://www.compo
    02-09
  • 【Ruby】Mac gem的一些坑
    前言自上一次升级MacOS系统后出现jekyll无法构建的问题,当时处理半天。谁知道最近又升级了MacOS,荒废博客多时,今天吝啬写了一篇准备发布,构建报错,问题重新。还是记录下,以防下次升级出问题。问题描述安装jekyll静态博客需要在Ruby环境下运行,于是参照
    02-09
  • iOS oc 调用 swift
    如股票oc要调用swift里面的代码 需要包含固定这个头文件项目名称 LiqunSwiftDemo-Swift.h         #ProjectName#-Swift.h固定的写法swift 目的 是取代oc 但是 不会完全取代 只是前端的替换LiqunSwiftDemo-Swift 点进去 可以看到 所有的swift代码 都产生
    02-09
  • objective-c NSTimer 定时器
    -(void)initTimer{//时间间隔NSTimeInterval timeInterval =3.0 ;//定时器repeats 表示是否需要重复,NO为只重复一次NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(mobileAnimation) userInfo:nil
    02-09
  • Objective-C  日记③ 字符串
    Objective-C 日记③ 字符串
    一、创建字符串、类方法   公式创建NSString  +(id) stringWithFormat:(NSString *) format,……;eg:  NSString *height;  height=[NSString stringWithFormat:@"高度是: %d 长度: %d",10,20];得到的字符串:“高度是: 10 长度: 20” 注意:  省
    02-09
  • Objective-C KVC机制
    Objective-C KVC机制http://blog.csdn.net/omegayy/article/details/7381301全部推翻重写一个版本,这是我在公司内做技术分享的文档总结,对结构、条理做了更清晰的调整。 1.    基本概念MODEL主要是英文文档里面经常出现的一些概念,讲解一下,方便英文
    02-09
  • objective-c 加号 减号 - +
    “加号代表static”是错误的说法,可能跟你那样表达的人其实意思是:“前置加号的方法相当于Java 里面的静态方法”。在Oc中,方法分为类方法和实例方法。前置加号(+)的方法为类方法,这类方法是可以直接用类名来调用的,它的作用主要是创建一个实例。有人把
    02-09
  • Objective-C  日记①
    Objective-C 日记①
    1、Xcode的.m扩展名表示文件含有Object-C代码,C以.c文件,C++以.cpp文件2、头文件声明:C使用:#include,O-C使用#import(当然你也可以使用#include) 3、输出方式:  C:printf("",参数);  O-C:NSLog(@"",参数); 4、布尔类型  C:bool 具有true
    02-09
  • ASP.NET MVC 操作AD 获取域服务器当前用户姓
    #region 根据当前登录域账号 获取AD用户姓名和所在OU目录/// summary/// 根据当前登录域账号 获取AD用户姓名和所在OU目录/// /summary/// param name="searchUser"要搜索的当前用户名/param/// param name="paths"out返回该用户所在OU目录/param/// param nam
    02-09
  • swift和OC - 拆分数组 和 拆分字符串
    1. 拆分数组 /// 根据 数组 截取 指定个数返回 多个数组的集合func splitArray( array: [Date], withSubSize subSize: Int) - [[Date]] {//数组将被拆分成指定长度数组的个数let count = array.count% subSize == 0 ? (array.count/ subSize) : (array.count
    02-08
点击排行