美文网首页NDK开发
NDK---C++篇(五)C++容器与谓词

NDK---C++篇(五)C++容器与谓词

作者: 初夏的雪 | 来源:发表于2021-06-19 21:01 被阅读0次

    直奔主题。。。。。。

    1、vector向量(类似于map)

    说明:

       **#include <vector> 引入库**
    
      **格式:vector<类型>  向量容器名;**
    

    1、原理:内部是封装了一个可以动态变化大小的数组作为容器,能够存放任务类型的数据,访问成员时需要使用迭代器访问

    2、vector2.begin() 与 vector.end() 是获取向量容器签名或后面的迭代器

    3、向量的添加vector.insert(迭代器,value),删除(vector.erase(迭代器)),读取:迭代器

    4、在对向量元素进行操作的时候可以通过begin ,end获取到迭代器进行位置的便宜来操作

    5、front() 与 back()默认获取第一个或最后一个元素的可读写引用,

    6、初始化时,可以不传参数,也可以给一个代表大小的参数,也可以给一个代表大小的参数和一个代码默认值的参数

    使用示例:

    int main(){
        //    vector<int> vector;//可以不传参数
        //    vector<int> vector(10); //代表大小
        vector<int> vector2(10, 1);//代表大小、默认值
    
        //添加
        vector2.insert(vector2.begin() + 5, 100);
        vector2.insert(vector2.end(), 199);
    
        //查询, 此处的auto会自动进行类型推导
        for (auto iterator = vector2.begin(); iterator != vector2.end(); iterator++) {
            cout << "vector容器的元素是:" << *iterator << endl;
        }
    
        //获取第一个元素的可读写引用
        cout << vector2.front() << endl;
        vector2.front() = 888;
        cout << vector2.front() << endl;
    
        //删除
        vector2.erase(++vector2.begin());
        for (auto iterator = vector2.begin(); iterator != vector2.end(); iterator++) {
            cout << "删除后的vector容器的元素是:" << *iterator << endl;
        }
        return 0;
    }
    
    
    
    /**
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:100
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:1
    vector容器的元素是:199
    1
    888
    删除后的vector容器的元素是:888
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:100
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:1
    删除后的vector容器的元素是:199
    */
    

    2、stack 栈 (先进后出,后进先出 FIFO----弹夹原理)

    说明:

          **格式:stack<类型>  栈容器名;**
    
          **引入库:#include <stack>**
    

    1、栈容器是有顺序的,不能随意在指定位置压栈;

    2、不能使用下标访问,也没有迭代器,如果想要则需要自己去完成;

    3、栈元素获取需要弹出栈,则栈内就不存在此元素了(特别注意)

    示例代码:

    int main(){
        stack<int> stackVar;
    
        // 压栈(注意:stack无法指定那个位置去压栈)
        stackVar.push(30);
        stackVar.push(60);
        stackVar.push(90);
    
        //出栈
        while (!stackVar.empty()) {
            cout << "栈容器的元素是:" << stackVar.top() << endl;//取栈顶元素
            stackVar.pop();//弹出并删除
        }
        return 0;
    }
    
    /**
    栈容器的元素是:90
    栈容器的元素是:60
    栈容器的元素是:30
    */
    

    3、queue 队列 (先进先出----管道运输原理)

    说明:

          **引入库:#include <queue>**
    
          **格式:queue<类型>  队列名**
    

    1、有序容器

    2、不能使用下标访问,也没有迭代器,

    3、栈元素获取需要弹出栈,则栈内就不存在此元素了(特别注意)

    示例代码:

    int main(){
        queue<int> queueVar;
    
        queueVar.push(20);
        queueVar.push(40);
        queueVar.push(60);
    
        while (!queueVar.empty()) {
            cout << "queue 队列 :" << queueVar.front() << endl;
            queueVar.pop(); // 把前面的元素 给消费掉  【删除】
        }
        return 0;
    }
    
    
    /**
    queue 队列 :20
    queue 队列 :40
    queue 队列 :60
    */
    

    4、priority_queue优先级队列

    说明:

      **是一种特殊的队列,内部是对vector进行了一定的封装,具备自动排序的本领;**
    
      **格式:priority_queue<int,vector<int>,less<int>>**
    
      **第一个参数:数据类型,第二个参数:内部需要一个vector,第三个参数:排序方式, 后面两个参数可以不写,默认是从大到小**
    

    示例代码:

    int main()
    {
        priority_queue<int, vector<int>, less<int>> priorityQueue;
        priorityQueue.push(20);
        priorityQueue.push(19);
        priorityQueue.push(40);
        priorityQueue.push(13);
        priorityQueue.push(12);
        priorityQueue.push(11);
        while (!priorityQueue.empty()) {
            cout << "优先级队列输出元素:" << priorityQueue.top() << endl;
            priorityQueue.pop();
        }
        return 0;
    }
    
    
    /**
    优先级队列输出元素:40
    优先级队列输出元素:20
    优先级队列输出元素:19
    优先级队列输出元素:13
    优先级队列输出元素:12
    优先级队列输出元素:11
    */
    

    5、list 列表

    说明:

              **格式:list<T>**
    
      **1、C++的list 内部是采用链表的结构,而Java的ArrayList采用的是数组的结构**
    
      **2、不用通过角标去访问,也不能修改**
    
      **3、元素数据可以重复**
    

    示例代码:

    int main(){
         list<int> listVar;
        listVar.push_front(100);//前面插入
        listVar.push_front(200);
        listVar.push_front(123);
        listVar.push_back(44);//后面插入
        listVar.insert(listVar.begin(), 88);//
        listVar.insert(listVar.end(), 34);
        listVar.erase(listVar.begin());//删除
        for (list<int>::iterator it = listVar.begin(); it != listVar.end(); it++) {
            cout << "list元素数据:" << *it << endl;
        }
        
        return 0;
    }
    
    
    /**
    list元素数据:123
    list元素数据:200
    list元素数据:100
    list元素数据:44
    list元素数据:34
    */
    

    6、set 集合

    说明:

          **引用库:#include<set>**
    
          **原理:内部是红黑树结构,会对存入的数据进行排序,不允许元素相同**
    
          **格式:set<int,less<int>>  setVar;**
    

    1、set容器在插入相同元素时,不会报错,但是会在insert的返回值pair的第二个值中得到结果

    2、insert 函数返回值的第一个元素是迭代器,

    3、会自动对原始进行排序(默认是从小到大的排序)

    4、无法插入自定义的对象(set的自动排序,无法对自定义的对象进行排序。需要自定义仿函数来解决)

    示例代码:

    int main(){
        set<int, greater<int>> setVar;
        setVar.insert(1);
        setVar.insert(4);
        setVar.insert(0);
        setVar.insert(9);
        pair<set<int, greater<int>>::iterator, bool> result = setVar.insert(9);
        if (result.second) {
            cout << "插入数据成功" << endl;
        } else {
            cout << "失败了..." << endl;
        }
    
        //遍历访问
        for (auto it = setVar.begin(); it != setVar.end(); it++) {
            cout << "set容器中的原始:" << *it << endl;
        }
        return 0;
    }
    
    
    /**
    失败了...
    set容器中的原始:9
    set容器中的原始:4
    set容器中的原始:1
    set容器中的原始:0
    */
    

    7、map容器

    说明:

              **引入库:#include<map>**
    
              **格式:map<int ,string> mapVar;**
    
      **1、map会对key排序**
    
      **2、默认key是不能重复**
    
      **3、map查询find函数的返回,如果没有找到会返回指向map结束的迭代器**
    

    示例代码:

    int main(){
        
        map<int, string> mapVar;
       
        //添加数据
        mapVar.insert(map<int, string>::value_type(3, "third"));
        mapVar.insert(pair<int, string>(1, "first"));
        mapVar[4] = "four";
        mapVar.insert(make_pair(2, "second"));
        
        //下面来插入重复的数据
        const pair<map<int, string>::iterator, bool> mapResult = mapVar.insert(pair<int, string>(4, "four"));
        if (mapResult.second) {
            cout << "map容器插入重复的key成功" << endl;
        } else {
            cout << "map容器插入重复的key失败" << endl;
        }
        
         //map查询
        map<int, string>::iterator iterator1 = mapVar.find(5);
        if (iterator1 != mapVar.end()) {
            cout << "查询map元素key =5 的值是:" << iterator1->second << endl;
        } else {
            cout << "没有找到查询map元素key =5" << endl;
        }
    
        //输出
        for (map<int,string>::iterator iterator=mapVar.begin();iterator!=mapVar.end();iterator++) {
            cout<<"map容器的元素:"<<iterator->first<<",value="<<iterator->second<<endl;
    
        }
        return 0;
    }
    
    /**
    map容器插入重复的key失败
    没有找到查询map元素key =5
    map容器的元素:1,value=first
    map容器的元素:2,value=second
    map容器的元素:3,value=third
    map容器的元素:4,value=four
    */
    

    8、multimap容器

    说明:

              **引入库:#include<map>**
    
              **格式:multimap<int ,string> multimapVar**
    
      **1、key 可以重复**
    
      **2、key重复的数据可分组**
    
      **3、key会排序**
    
      **4、value不会排序**
    
      **5、 multimap 的查询,返回的结果需要自己做判断,否则会包含第一个找到的位置开始一直到map的end()**
    

    示例代码:

    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;
        }
    
    
        multimap<int, string>::iterator iteratorVar = multimapVar.find(20);
        while (iteratorVar != multimapVar.end()) {
            cout <<"查询的结果:"<< iteratorVar->first << "," << iteratorVar->second << endl;
    
            // 需要自己做逻辑控制,不然有问题
            iteratorVar++;
    
            if (iteratorVar->first != 20) {
                break;; // 循环结束
            }
    
    //        // 严谨性
            if (iteratorVar == multimapVar.end()) {
                break;; // 循环结束
            }
        }
    
        return 0;c
    }
    
    
    /**
    10,十个1
    10,十个2
    10,十个3
    20,二十1
    20,二十2
    20,二十3
    30,三十1
    30,三十3
    30,三十2
    查询的结果:20,二十1
    查询的结果:20,二十2
    查询的结果:20,二十3
    
    */
    

    9、谓词 ===仿函数

    说明:

      **1、系统的谓词基本上都是针对基本数据类型(如刚学习过的容器中的less<int>),不支持对象比较**
    
      **2、自定的谓词:结构体格式的谓词**
    
      **3、谓词有几个参数,就是几元谓词**
    

    示例代码:

    //标准自定义谓词的格式
    class Person {
    public:
        string name;
        int id;
    
        Person(string name, int id) {
            this->name = name;
            this->id = id;
        }
    };
    
    struct doCompareAction {
    public:
        bool operator()(const Person &person1, const Person &person2) {
            return person1.id > person2.id;
        }
    };
    
    int main(){
        set<Person, doCompareAction> objSetVar;
        objSetVar.insert(Person("zhangsan", 2));
        objSetVar.insert(Person("lisi", 1));
        objSetVar.insert(Person("wangwu", 4));
        objSetVar.insert(Person("huangliu", 3));
        for (set<Person, doCompareAction>::iterator iterator = objSetVar.begin(); iterator != objSetVar.end(); iterator++) {
            cout << "自定义谓词:name=" << iterator->name << ", id=" << iterator->id << endl;
        }
        return 0;
    }
    
    
    
    /**
    自定义谓词:name=wangwu, id=4
    自定义谓词:name=huangliu, id=3
    自定义谓词:name=zhangsan, id=2
    自定义谓词:name=lisi, id=1
    */
    

    10、仿函数与回调函数(仿函数的扩展性更强)

    示例代码:

    // 回调函数 (功能够简单)
    void showAction(int __first) {
        cout << "回调函数" << __first << endl;
    }
    
    //仿函数
    class showActionObj{
    public:
        int count =0;
        void operator()(int _first){
            cout<<"仿函数:"<<_first<<endl;
            count++;
        }
    };
    
    
    int main(){
        set<int> setaaaVar;
    
        setaaaVar.insert(10);
        setaaaVar.insert(20);
        setaaaVar.insert(30);
        setaaaVar.insert(40);
        setaaaVar.insert(50);
        setaaaVar.insert(60);
    
        // TODO 回调函数
        for_each(setaaaVar.begin(), setaaaVar.end(), showAction);
        showActionObj obj;
        obj= for_each(setaaaVar.begin(),setaaaVar.end(),obj);
        cout<<"调用次数:"<<obj.count<<endl;
        return 0;
    }
    

    以上就是我们常用的一些容器,包括容器中用到的谓词,仿函数,回调等的介绍。

    下节预告:线程

    相关文章

      网友评论

        本文标题:NDK---C++篇(五)C++容器与谓词

        本文链接:https://www.haomeiwen.com/subject/infyjltx.html