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

目录
  • 1.C++ vector向量
  • 2.C++ stack 栈
  • 3.C++ queue 队列
  • 4.优先级队列
  • 5.C++ list
  • 6.c++ set 集合
  • 7.C++ map函数
  • 8.C++ multimap容器
  • 9.C++ 谓词
  • 10.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;
}

到此这篇关于C++ STL容器与函数谓词示例分析讲解的文章就介绍到这了,更多相关C++ STL容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++深入分析STL中map容器的使用

    目录 1.map容器 2.map容器原理 3.map容器函数接口 4.使用示例 1.map容器 map是C++ STL的一个关联容器,它提供一对一的数据处理能力.其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int.double 等).使用结构体或类自定义的类型. 第一个可以称为关键字(key): 第二个可能称为该关键字的值(value): 该容器存储的都是 pair<const K, T> 类型(其中 K 和 T 分别表示键和值的数据类型)的键值对元素. 使用 ma

  • C++ STL标准库std::vector扩容时进行深复制原因详解

    目录 引子 查找原因 解决方法 结论 引子 但是笔者却发现了一个奇怪的现象,std::vector扩容时,对其中的元素竟然进行的是深复制.请看示例代码: #include <iostream> #include <vector> struct Test { Test() {std::cout << "Test" << std::endl;} ~Test() {std::cout << "~Test" <

  • C++STL教程之vector模板的使用

    目录 vector模板类 1. vector模板类 1.1 创建模板类 1.2 STL容器都提供的成员方法 1.3 vector特有的成员方法 1.4 STL容器的非成员方法 vector模板类 STL(标准模板库)提供了容器.迭代器.函数对象.算法的模板.容器是类似于数组的东西,它可以存储若干值,STL容器是同质的,即存储的值的类型相同;迭代器是用来遍历容器的,它和能遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象和函数指针;算法就是一些能完成特定任务的处方. 我们来看

  • C++ 基础函数的介绍及使用(Vector+deque)

    目录 一.Vector的基础函数 1. 构造函数 2. 增加元素 3. 删除元素 4. 遍历vector 5. 判断函数 6. 大小函数 7. 其他函数 二.deque的介绍及使用 三.deque 和 vector的差别 1.构造函数 2.常用成员函数 3.特点 一.Vector的基础函数 之前有学习过 vector.set.map等容器,都是需要什么搜什么,没有详细的了解其中的内容.最近在看 STL 的相关内容,就顺手整理一些基础性内容,避免以后遇到的时候再临时抱佛脚. 1. 构造函数 vec

  • C++ STL 中的数值算法示例讲解

    目录 1.iota 2.accumulate 3.partial_sum 4.adjacent_difference 5.inner_product 以下算法均包含在头文件 numeric 中 1.iota 该函数可以把一个范围内的序列从给定的初始值开始累加先看用法.例:假设我需要一个长度为10,从5开始递增的序列 vector<int> a(10); iota(begin(a), end(a), 5); for (auto x : a) { cout << x <<

  • C++常见的stl容器与相关操作 示例解析

    目录 sort排序 vector map unordered_map set queue stack 创建容器时指定排序规则 sort排序 针对含有迭代器的容器,可以用#include<algorithm>中的sort函数进行排序. 默认排序是从小到大,可以自己写仿函数,也可以用greater<int>()或者less<int>(). #include <vector> #include <algorithm> #include <iost

  • C++浅析STL 迭代器 容器的使用

    目录 STL定义 STL六大组件 vector vector嵌套容器 STL定义 STL(Standard Template Library 标准模板库) STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接 STL几乎所有的代码都采用了模板类或者模板函数 STL六大组件 STL大体分为六大组件,分别是: 容器.算法.迭代器.仿函数.适配器.空间配置器 1.容器: 各种数据结构,如vector.list.de

  • C++  STL _ Vector使用及模拟实现

    目录 1.Vector的介绍 1.1 Vector的介绍 2.Vector的使用 2.1 vector的定义 2.2 vector 迭代器的使用 2.3 vector的空间增长问题 3. vector的增删查改 3.1 push_back (重点) 3.2 pop_back (重点) 3.3 insert 3.4 erase 3.5 operator [ ] 1.Vector的介绍 1.1 Vector的介绍 ​ ​vector官方文档介绍​​ 1.vector是表示可变大小数组的序列容器. 2

  • C++ STL反向迭代器的实现

    反向迭代器其实就行对正向迭代器进行封装,源生迭代器,为了实现运算符的结果不同,正向迭代器也对源生迭代器进行了封装. 反向迭代器的适配器,就是 Iterator是哪个容器的迭代器,reverse_iterator < Iterator >就可以 适配出哪个容器的反向迭代器.复用的体现. 反向迭代器适配器结构: template <class Iterator, class Ref, class Ptr> class reverse_iterator { typedef reverse

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

    目录 1.C++ vector向量 2.C++ stack 栈 3.C++ queue 队列 4.优先级队列 5.C++ list 6.c++ set 集合 7.C++ map函数 8.C++ multimap容器 9.C++ 谓词 10.C++内置预定义函数 C++ STL(Standard Template Library标准模板库),相当于java的集合模块, STL 有很多的容器. 1.C++ vector向量 (内部:封装动态大小数组作为容器,能够存放任意的动态数组) #include

  • 停止编写 API函数原因示例分析

    目录 正文 你可能会问为什么?有一些很好的理由: 一个非常简单的 CRUD 构造器 高级 CRUD 构造器 过滤 转换和分页 准备 自定义接口 最终的 BRUD 构造器 正文 RESTFUL API 通常提供在不同实体上执行增删改查(CRUD)操作的一组接口.我们通常在我们的前端项目中为这些每一个接口提供一个函数,这些函数的功能非常的相似,只是为了服务于不用的实体.举个例子,假设我们有这些函数. // api/users.js // 创建 export function createUser(u

  • Spring Boot示例分析讲解自动化装配机制核心注解

    目录 1. 自动化装配介绍 2. Spring Boot 自动化配置UML图解 3. Spring Boot 自动化配置核心注解分析 3.1 @Inherited 3.2 @SpringBootConfiguration 3.3 @EnableAutoConfiguration 3.4 @ComponentScan 3.5 @ConfigurationPropertiesScan 3.6 @AutoConfigurationImportSelector 3.7 @AutoConfiguratio

  • C++实现STL容器的示例

    各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector.deque.map: 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的! 2. 序列式容器才可以在容器初始化的时候制定大小,关联式容器不行: 3.注意,关联容器的迭代器不支持it+n操作,仅支持it++操作. 适配器的概念 适配器的意思就是将某些已经存在的东西进行限制或者组合变成一个新的东西,这个新的东西体现一些新的特性,但底层都是由一些已经存在的东西实现的. STL中的容器

  • C++模拟实现STL容器vector的示例代码

    目录 一.vector迭代器失效问题 二.模拟实现构造函数调用不明确 1.问题描述 2.解决调用不明确的方法 三.reserve中的深浅拷贝问题 1.reserve中浅拷贝发生原因 2.浅拷贝发生的图解 3.解决方法 四.模拟实现vector整体代码 一.vector迭代器失效问题 1.Visual Studio和g++对迭代器失效问题的表现 int main(){ std::vector<int>v{1,2,3,4}; std::vector<int>::iterator it

  • 非常实用的MySQL函数全面总结详解示例分析教程

    目录 1.MySQL中关于函数的说明 2.单行函数分类 3.字符函数 4.数学函数 5.日期时间函数 6.其它常用系统函数 7.流程控制函数 8.聚合函数 1)聚合函数的功能和分类: 2)聚合函数的简单使用 3)五个聚合函数中传入的参数,所支持的数据类型有哪些? 4)聚合函数和group by的使用"最重要": 1.MySQL中关于函数的说明 "概念":类似java.python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名: "好处":

  • C++示例分析内联函数与引用变量及函数重载的使用

    目录 1.内联函数 1.1为什么使用内联函数 1.2语法 2.引用变量 2.1为什么要使用引用变量 2.2语法 2.3对于C语言的改进 3. 函数重载 3.1默认参数 3.2函数重载 1.内联函数 1.1为什么使用内联函数 减少上下文切换,加快程序运行速度. 是对C语言中的宏函数的改进. 1.2语法 #include<iostream> using namespace std; inline double square(double x){ return x*x; } int main(){

  • C++ Boost Phoenix库示例分析使用

    目录 一.说明 二.预先知道Boost.Phoenix 三.示例和代码 一.说明 在函数式编程模型中,函数是对象,与其他对象一样,可以作为参数传递给函数或存储在容器中.有许多支持函数式编程模型的 Boost 库. Boost.Phoenix 是这些库中最广泛.也是最重要的库.它取代了库 Boost.Lambda,它被简要介绍,但只是为了完整性. Boost.Function 提供了一个类,可以轻松定义函数指针,而无需使用源自 C 编程语言的语法. Boost.Bind 是一个适配器,即使实际签名

  • Python iter()函数用法实例分析

    本文实例讲述了Python iter()函数用法.分享给大家供大家参考,具体如下: python中的迭代器用起来非常灵巧,不仅可以迭代序列,也可以迭代表现出序列行为的对象,例如字典的键.一个文件的行,等等. 迭代器就是有一个next()方法的对象,而不是通过索引来计数.当使用一个循环机制需要下一个项时,调用迭代器的next()方法,迭代完后引发一个StopIteration异常. 但是迭代器只能向后移动.不能回到开始.再次迭代只能创建另一个新的迭代对象. 反序迭代工具:reversed()将返回

随机推荐