• Android NDK篇-C++之 SLT 中的容器学习与函数谓词


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

    1.c++ vector向量(内部:封装动态大小数组作为容器,能够存放任意的动态数组)

    #include 
    
    #include  // 引入 vector 容器的支持
    // NDK 开发 一定要用容器  应该 queue 队列
    using namespace std;
    int main() {
    
        vector vector1;
        vector vector2(10); // 指定10的空间大小
        vector vector3(10, 0); // 有了10个值了 每个值都是0
        vector 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::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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • vector4.begin() 迭代器 插入到前面
    • vector4.end() 迭代器 插入到后面

    2.c++ stack 栈

    #include 
    using namespace std;
    
    int main() {
        stack 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    3.c++ queue 队列

    #include 
    using namespace std;
    
    int main() {
        queue 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    4.优先级队列

    #include 
    #include 
    using namespace std;
    
    int main() {
       
        // priority_queue priorityQueue;
        priority_queue, less> 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • priority_queue 内部对我们前面的vector 有一定的封装
    • 优先级队列会自动进行排序操作
    • priority_queue priorityQueue:这样声明优先级队列,相当于priority_queue priorityQueue,省略了比较策略等
    • less return __x < __y: 从大到小
    • greater return __x > __y: 从小到大

    5.c++ list

    #include 
    #include 
    using namespace std;
    
    int main() {
        list 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • Java:ArrayList采用Object[]数组, C++的list 内部:采用链表
    • 不用通过角标去访问、修改 、遍历

    6.c++ set 集合

    #include 
    #include 
    
    using namespace std;
    
    int main() {
        set> setVar;
        
        setVar.insert(1);
        setVar.insert(3);
        setVar.insert(2);
        setVar.insert(4);
    
        pair>::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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • set(内部:红黑树结构),会对你存入的数据进行排序,不允许元素相同
    • __x < __y 从小到大,默认情况下 就是 less
    • 添加参数,不需要用迭代器,也不需要指定位置
    • 重复插入,会提示插入失败

    7.c++ map函数

    #include 
    #include 
    
    using namespace std;
    
    int main() {
        
        // 注意:map会对key进行排序,默认 key不能重复
        map mapVar;
    
        // TODO 添加数据
        // 第一种方式
        mapVar.insert(pair(1, "唐三"));
    
        // 第二种方式
        mapVar.insert(make_pair(2, "小舞"));
    
        // 第三种方式
        mapVar.insert(map::value_type (3, "宁荣荣"));
    
        // 上面三种方式 key不能重复
        // 思考:既然会对key进行排序,那么key是不能重复的(会插入失败)
        std::pair::iterator ,bool> r=mapVar.insert(pair(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::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {
            cout << it->first << "," << it->second.c_str() << "\t";
        }
        cout << endl;
    
    
        // 查找,操作
        map ::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::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {
            cout << it->first << "," << it->second.c_str() << "\t";
        }
        cout << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 通过pair 插入数据如果id重复会插入失败,不会覆盖
    • 通过mapVar[4] = "马红俊"这个方式插入数据,如果id重复会进行覆盖
    • 通过erase函数删除元素,如果id不存在不会报错

    8.c++ multimap容器

    #include 
    #include 
    
    using namespace std;
    
    int main() {
        multimap 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::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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • multimap核心功能是分组
    • multimap key可以重复,key重复的数据可以分组,key会自动进行排序

    9.c++ 谓词

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

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

    #include 
    #include 
    
    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 setVar;
        // set 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::iterator it = setVar.begin(); it != setVar.end() ; it ++) {
            cout << it->name.c_str() << " , " << it->id << endl;
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • c++ Set集合,默认的谓词不能对对象类型的比较,如果set集合传入对象类型需要自定义谓词来处理
    • 谓词定义的规则:定义一个结构体,bool operator() 这部分是固定格式 参数部分是两个常量引用类型数据,返回比较两个对象的维度就可以

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

    // C++ 预定义函数(C++ 内置函数)
    
    #include 
    
    
    using namespace std;
    
    int main() {
        // "Derry" + "AAAA" // 运算符重载
    
        // C++已经提供了 预定义函数  plus,minus,multiplies,divides,modulus ...
        plus add_func;
    
        int r = add_func(1, 1);
        cout << r << endl;
    
        plus add_func2;
        string r2 = add_func2("AAAA", "BBB");
        cout << r2 << endl;
    
        plus add_func3;
        float r3 = add_func3(4354.45f, 34.3f);
        cout << r3 << endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Java基础【理解版】
    ArcGIS实验教程——实验四十八:ArcGIS制图表达入门及案例教程
    用友一面面经
    php将数组中的最后一个元素放到第一个
    新来的员工,突然在我面前哭了
    js基础API初学
    Jtti:Linux大文件重定向和管道的效率哪个更高
    Yakit工具篇:WebFuzzer模块之序列操作
    misc类设备驱动2——misc驱动框架源码分析
    Maven 引入中央仓库中不存在/自定义/第三方的 jar 包、以及打包为生成可运行 jar 包
  • 原文地址:https://blog.csdn.net/u014078003/article/details/126290349