美文网首页
c++进阶-STL函数对象和谓词

c++进阶-STL函数对象和谓词

作者: Peakmain | 来源:发表于2019-03-12 12:48 被阅读0次

    Map容器的介绍和使用

    • 添加数据,一共四种方式,第一种和第四种最常用。
    • 查找数据find
    #include<map>
    using namespace std;
    void main(){
        //map会对key进行排序,二叉树的算法
        map<int, string> map1;
        //添加数据  
        //第一种方式
        map1.insert(pair<int, string>(1, "peakmain1"));
        //第二种方式
        map1.insert(make_pair(2, "peakmain2"));
        //第三种方式
        map1.insert(map<int, string>::value_type(3, "peakmain3"));
        //第四种方式
        map1[4] = "peakmain4";
    
        map1[0] = "peakmain0";
        //循环,迭代器
        for (map<int, string>::iterator it = map1.begin(); it != map1.end(); it++){
            cout << it->first << "==" << it->second.c_str()<<endl;
        }
        cout << "-------------------------------循环遍历结束-------------------------------" << endl;
        //查找
        map<int,string>::iterator find_it=map1.find(55);
        if (find_it != map1.end()){
            cout << find_it->first << "==" << find_it->second.c_str() << endl;
        }
        else{
            cout << "找不到" << endl;
        }
        getchar();
    }
    

    添加数据的四种方式的区别:前面三种方式,key重复的话不生效,值不会改变,而第四种方式值会被覆盖

    multimap的使用:允许键值重复

    void main(){
        multimap<int, string>map;
    
        map.insert(pair<int, string>(01, "01"));
        map.insert(pair<int, string>(01, "02"));
        map.insert(pair<int, string>(01, "03"));
    
        map.insert(pair<int, string>(02, "21"));
        map.insert(pair<int, string>(02, "22"));
        map.insert(pair<int, string>(02, "23"));
    
        map.insert(pair<int, string>(03, "33"));
        map.insert(pair<int, string>(03, "34"));
        map.insert(pair<int, string>(03, "35"));
    
        //遍历
        for (multimap<int, string>::iterator it = map.begin(); it != map.end(); it++){
            cout << it->first << "==" << it->second.c_str() << endl;
        }
        cout << "-------------------------------循环遍历结束-------------------------------" << endl;
        //分组查询
        multimap<int,string>::iterator find_it= map.find(1);
        //分组遍历
        while (find_it != map.end()){
            cout << find_it->first << "==" << find_it->second.c_str() << endl;
            find_it++;
            if (find_it==map.end()||find_it->first != 1){
                break;
            }
        }
    
        getchar();
    }
    

    容器对象拷贝函数

    c++中会调用对象的拷贝构造函数,存进去的是另一个对象
    存在的错误:析构函数可能会调用多次,如果说在析构函数中释放内存,需要在浅拷贝构造函数中进行深拷倍

    class Person{
    public:
        string name;
    public:
        Person(string name){
            this->name = name;
        }
        void setName(string name){
            this->name = name;
        }
        Person(const Person &person)    {
            cout << "拷贝构造函数" << endl;
        }
    
    };
    //容器对象拷贝函数
    void main(){
        vector<Person> vector1;
        Person person1("peakmain1");
        vector1.push_back(person1);
        //值并没有改变
        person1.setName("Trasure");
    
        Person person = vector1.front();
        cout << person.name.c_str() << endl;
        getchar();
    }
    

    普通函数和仿函数

    class Compare
    {
    public:
        //重载了括号运算符
        void operator()(){
            cout << "仿函数" << endl;
        }
    
    };
    
    void compare1(){
        cout << "普通函数" << endl;
    }
    void main(){
        Compare compare;
        //仿函数
        compare();
        //普通函数
        compare1();
        getchar();
    }
    

    仿函数,一元谓词(能够记录状态)

    #include<algorithm>//预定义的函数和实现好的算法头文件
    class Person{
    public:
        int count;
    public:
        void operator()(int number){
            cout << number << endl;
            count++;
        }
    };
    void main(){
        set<int> set1;
        set1.insert(5);
        set1.insert(100);
        set1.insert( 90);
        set1.insert(80);
    
        //for_each迭代器:非常重要的一点,仿函数要保持记录状态,要确保对象一致,可以用返回值
        //for_each(set1.begin(), set1.end(), print);
        Person person;
        person=for_each(set1.begin(), set1.end(), person);
        cout << "次数:"<<person.count << endl;
        getchar();
    }
    

    二元谓词

    class Constans{
    public:
        int count;
    public:
           //两个参数
        bool operator()(const string str1, const string str2){
            return str1 < str2;
        }
    };
    void main(){
        //二元谓词的函数
        set<string,Constans> set1;
        set1.insert("aaa");
        set1.insert("bbbb");
        set1.insert("ccc");
        set1.insert("dddd");
        set1.insert("ee");
    
        for (set < string>::iterator it = set1.begin(); it != set1.end(); it++){
            cout << (*it).c_str() << endl;
        }
        getchar();
    }
    

    相关文章

      网友评论

          本文标题:c++进阶-STL函数对象和谓词

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