美文网首页
C++高级之Map和自定义多元谓词

C++高级之Map和自定义多元谓词

作者: 大虾啊啊啊 | 来源:发表于2022-08-07 20:52 被阅读0次

    1、map

    键值对形式的数据结构

    • insert方式插入
      key不不能重复,并且默认按照key从小到大排序
        map<int, string> map;
        map.insert(make_pair(40, "32"));
        map.insert(make_pair(10, "10"));
        map.insert(make_pair(10, "11"));
        map.insert(make_pair(10, "12"));
        map.insert(make_pair(30, "30"));
        map.insert(make_pair(20, "30"));
        map.insert(make_pair(20, "31"));
        map.insert(make_pair(30, "22"));
        map.insert(make_pair(30, "32"));
        for (auto it = map.begin(); it != map.end(); it++) {
            cout<<it->first<<" "<<it->second<<endl;
        }
    
    
    10 10
    20 30
    30 30
    40 32
    
    • [ ]方式赋值
      相同key会覆盖、默认也是从小到大排序
        map<int, string> map;
        map[10] = "10";
        map[10] = "15";
        map[20] = "20";
        map[15] = "15";
    
        for (auto it = map.begin(); it != map.end(); it++) {
            cout<<it->first<<" "<<it->second<<endl;
        }
    
    
    10 15
    15 15
    20 20
    
    
    • find函数获取指定key对应的元素
        map<int, string> map;
        map[10] = "10";
        map[10] = "15";
        map[20] = "20";
        map[15] = "15";
        auto it = map.find(20);
        cout << it->first << " " << it->second << endl;
    
    20 20
    
    
    • multimap
      key可以重复,并且按照key进行分组排序
        map.insert(make_pair(40, "32"));
        map.insert(make_pair(10, "10"));
        map.insert(make_pair(10, "11"));
        map.insert(make_pair(10, "12"));
        map.insert(make_pair(30, "30"));
        map.insert(make_pair(20, "30"));
        map.insert(make_pair(20, "31"));
        map.insert(make_pair(30, "22"));
    
        for (auto it = map.begin(); it != map.end(); it++) {
            cout<<it->first<<" "<<it->second<<endl;
        }
    
    
    10 10
    10 11
    10 12
    20 30
    20 31
    30 30
    30 22
    40 32
    

    2、谓词(仿函数)

    class ComPareObject{
    public:
        void operator()(){
            cout<<"仿函数"<<endl;
        }
    };
    
    void fun(){
        cout<<"普通函数"<<endl;
    }
    
    int main() {
        ComPareObject f;
        f.operator()();
        fun();
    }
    
    
    仿函数
    普通函数  
    

    3、自定义谓词(仿函数)

    • 自定义谓词实现foreach遍历
    class ComPare {
    public:
        void operator()(int item) {
            cout << "遍历结果:" << item << endl;
        }
    };
    
    int main() {
        set<int> sets;
        sets.insert(20);
        sets.insert(50);
        sets.insert(10);
        sets.insert(88);
        sets.insert(9);
        auto begintIt = sets.begin();
        auto endIt = sets.end();
        for_each(begintIt, endIt,ComPare());
    }
    
    遍历结果:9
    遍历结果:10
    遍历结果:20
    遍历结果:50
    遍历结果:88
    
    • 使用普通函数遍历
    void forEach(int item){
        cout << "遍历结果:" << item << endl;
    }
    
    int main() {
        set<int> sets;
        sets.insert(20);
        sets.insert(50);
        sets.insert(10);
        sets.insert(88);
        sets.insert(9);
        auto begintIt = sets.begin();
        auto endIt = sets.end();
        for_each(begintIt, endIt,forEach);
    }
    
    遍历结果:9
    遍历结果:10
    遍历结果:20
    遍历结果:50
    遍历结果:88
    
    • for_each源码分析
      template<typename _InputIterator, typename _Function>
        _GLIBCXX20_CONSTEXPR
        _Function
        for_each(_InputIterator __first, _InputIterator __last, _Function __f)
        {
          // concept requirements
          __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
          __glibcxx_requires_valid_range(__first, __last);
          for (; __first != __last; ++__first)
        __f(*__first);
          return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
        }
    

    需要三个参数,第一二个参数分别是迭代器首尾,而第三个参数则需要一个Function,可以理解成需要传入一个函数。接着下面其实几是通过迭代器++然后调用传过来的function。有点类似Kotlin中的高阶函数。

    4、自定义多元谓词

    仿函数中有一个参数称一元谓词,多个参数称为多元谓词

    • 通过自定义多元谓词实现比较器排序
    class ComPare {
    public:
        //二元谓词
        bool operator()(int _x, int _y) {
            return _x > _y;
        }
    };
    int main() {
        set<int, ComPare> sets;
        sets.insert(20);
        sets.insert(50);
        sets.insert(10);
        sets.insert(88);
        sets.insert(9);
        for (auto it = sets.begin(); it != sets.end(); it++) {
            cout << *it << endl;
        }
    }
    
    88
    50
    20
    10
    9
    

    5、对象在容器中的生命周期变化

    class Student {
    public:
        int age;
        string name;
    
        Student(int age, string name) {
            this->age = age;
            this->name = name;
        }
    
        Student(const Student &student) {
            cout << "拷贝构造函数" << endl;
            this->age = student.age;
            this->name = student.name;
        }
    
        ~Student() {
            cout << "析构函数" << endl;
        }
    
    };
    
    
    int main() {
        Student student(18, "小红");
        vector<Student> v;
        //执行一次拷贝构造函数,把对象拷贝到容器
        v.insert(v.begin(), student);
        student.age = 20;
        cout << "student的值:" << student.age << student.name << endl;
        //执行一次拷贝构造函数,把容器对象拷贝出来
        Student student2 = v.front();
        cout << "student2的值:" << student2.age << student2.name << endl;
        //弹栈的时候,会弹出 student student2 以及容器总的student,所以调用三次析构函数
    }
    
    拷贝构造函数
    student的值:20小红
    拷贝构造函数
    student2的值:18小红
    析构函数
    析构函数
    析构函数
    

    6、 C++ 预定义函数

    C++的一些内置函数

        plus<int> add_func;
        plus<string> add_func2;
    
        int value = add_func(1,3);
        string value2 = add_func2("1","2");
        cout << value<<"-----"<<value2<< endl;
    
    
    4-----12
    
    

    相关文章

      网友评论

          本文标题:C++高级之Map和自定义多元谓词

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