美文网首页
C++高级之C++内部源码阅读与手写多元谓词

C++高级之C++内部源码阅读与手写多元谓词

作者: Dalvik_ | 来源:发表于2021-04-26 14:26 被阅读0次

    1.map容器学习

    #include <iostream>
    #include <map>
    
    using namespace std;
    
    int main() {
        map<int, string> mapVar;
        // 插入数据
        // 第一种方式
        mapVar.insert(pair<int, string>(1, "a"));
        // 第二种方式
        mapVar.insert(make_pair(2, "b"));
        // 第三种方式
        mapVar.insert(map<int, string>::value_type(3, "c"));
        // 第四种方式
        mapVar[4] = "d";
        mapVar[4] = "F";
    
        // 重复的key会插入失败
        pair<map<int, string>::iterator, bool> result = mapVar.insert(make_pair(2, "BBB"));
        if (result.second) {
            cout << "insert success" << endl;
        } else {
            cout << "insert fail" << endl;
        }
        // map 遍历
        for (map<int, string>::iterator iterator = mapVar.begin(); iterator != mapVar.end(); iterator++) {
            cout << iterator->first << ":" << iterator->second.c_str() << endl;
        }
        cout << endl;
        // 数据获取
        map<int, string>::iterator iterator1 = mapVar.find(4);
        if (iterator1 != mapVar.end()) {
            cout << iterator1->first << ":" << iterator1->second.c_str() << endl;
        }
        return 0;
    }
    
    

    2.multimap 容器学习

    int main() {
        // 1.key可以重复, 2.key重复的数据可以分组,  3.key会排序,  4.value不会排序
        multimap<int, string> multimapVar;
        multimapVar.insert(make_pair(1, "a"));
        multimapVar.insert(make_pair(1, "b"));
        multimapVar.insert(make_pair(1, "c"));
    
        multimapVar.insert(make_pair(3, "ccc"));
        multimapVar.insert(make_pair(3, "bbb"));
        multimapVar.insert(make_pair(3, "aaa"));
    
        multimapVar.insert(make_pair(2, "aa"));
        multimapVar.insert(make_pair(2, "bb"));
        multimapVar.insert(make_pair(2, "cc"));
    
        for (auto iterator = multimapVar.begin(); iterator != multimapVar.end(); iterator++) {
            cout << iterator->first << ":" << iterator->second.c_str() << endl;
        }
        return 0;
    }
    

    3.谓词 与仿函数

    //谓词函数  返回值为bool函数
    bool op(const string &str1, const string &str2) {
        return str1 > str2;
    }
    
    // 仿函数  一个类或者结构体 重载() 返回值可以是任何值
    class Action {
        void operator()(const string &str) {
    
        }
    };
    
    

    空谓词 一元谓词 二元谓词

    4.for_each 自定义仿函数

    
    #include <algorithm> // 算法包
    #include <vector>
    
    // 自定义仿函数
    class ActionSow {
    public:
        void operator()(const int &num) {
            cout << num << endl;
        }
    };
    
    int main() {
        vector<int> vectorVar;
        vectorVar.insert(vectorVar.begin(), 2);
        vectorVar.insert(vectorVar.begin(), 4);
        vectorVar.insert(vectorVar.begin(), 6);
        vectorVar.insert(vectorVar.begin(), 8);
        // for_each 自定义仿函数输出
        for_each(vectorVar.begin(), vectorVar.end(), ActionSow());
        return 0;
    
    

    5.函数回调 仿函数的各个用途

    #include <algorithm> // 算法包
    #include <vector>
    
    // 自定义仿函数 可以做自己的业务逻辑
    class ActionSow {
    public:
        int count;
    
        void operator()(const int &num) {
            cout << num << endl;
            count++;
        }
    };
    
    // 回调函数功能简单
    void showAction(const int &num) {
        cout << num << endl;
    }
    
    int main() {
        vector<int> vectorVar;
        vectorVar.insert(vectorVar.begin(), 2);
        vectorVar.insert(vectorVar.begin(), 4);
        vectorVar.insert(vectorVar.begin(), 6);
        vectorVar.insert(vectorVar.begin(), 8);
        // for_each 自定义仿函数输出
        ActionSow actionSow;
        actionSow = for_each(vectorVar.begin(), vectorVar.end(), actionSow);
        cout << "all count=" << actionSow.count << endl;
        // for_each 自定义回调函数
        for_each(vectorVar.begin(), vectorVar.end(), showAction);
        return 0;
    }
    

    6.类型传递的仿函数 怎么看源码得知写法

    7.对象存入到容器后,对象生命周期的变化
    set集合存入的元素会自动排序,所以不能直接存入对象,可以通过自定义仿函数来解决。
    构造函数 拷贝构造函数 析构函数

    对象插入容器中 会执行拷贝构造函数

    // 专业的C++工程师开发有用 ,知识补充: 对象存入到容器后  对象的生命周期 状态
    
    #include <iostream>
    #include <set> // set 存入对象 奔溃(set会自动排序,对象没法排序,所以奔溃)  解决方案:自定义仿函数解决
    #include <vector>  // 存入对象
    
    using namespace std;
    
    class Person {
    private:
        string name;
    public:
        Person(string name) : name(name) {}
    
        void setName(string name) {
            this->name = name;
        }
    
        string getName() {
            return this->name;
        }
    
        Person(const Person &person) {
            this->name = person.name; // 浅拷贝
    
            cout << "Person拷贝构造函数执行了..." << endl;
        }
    
        ~Person() {
            cout << "Person析构函数执行了" << endl;
        }
    };
    
    int main() {
        // Java:把对象存入 添加到 集合
        // C++: 调用拷贝构造函数,存进去的是另一个新的对象
    
        vector<Person> vectorVar;
    
        // person 被main函数弹栈 析构一次
        Person person("Derry"); // 2  Derry
    
        // 里面的insert函数弹栈 析构一次
        vectorVar.insert(vectorVar.begin(), person); // 外面的person是旧地址,到insert函数里面的person就是新地址(拷贝构造函数 一次)
    
        person.setName("Kevin"); // 1
    
        // newPerson 被main函数弹栈 析构一次
        Person newPerson =
                vectorVar.front(); // front里面的person是旧地址, 外面的newPerson就是新地址(拷贝构造函数 一次)
    
        cout << "newPerson:" << newPerson.getName().c_str() << endl;
    
        // 3次析构函数   两次拷贝构造
    
        return 0;
    } // main弹栈  对象插入容器到调用拷贝构造函数
    输出:
    Person拷贝构造函数执行了...
    Person拷贝构造函数执行了...
    newPerson:Derry
    Person析构函数执行了
    Person析构函数执行了
    Person析构函数执行了
    
    

    8.预定义函数(C++内置函数)

    #include <iostream>
    #include <set> // STL包
    #include <algorithm> // 算法包
    using namespace std;
    
    int main() {
        // 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相加
        float r3 = add_func3(4354.45f, 34.3f);
        cout << r3 << endl;
    
        return 0;
    }
    

    手写预定义函数

    template<typename T>  // 模板函数  运算符重载
    struct plus_d
    {
        T operator() (const T & x, const T & y) {
            return x + y;
        }
    };
    
    

    相关文章

      网友评论

          本文标题:C++高级之C++内部源码阅读与手写多元谓词

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