• C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素


    01昨天课程回顾

    02函数对象适配器

    函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征。因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候就需要函数适配器来为我们的函数进行适配。

    使用方法:

    第一步 让函数对象


    1 绑定器适配器

    作用: 可以动态改变函数对象的一个参数,不用生成多个函数对象

    2. 取反适配器

    作用:改变函数谓词(返回值为bool的函数对象)的返回状态//true改为false  false改为true

     

    3. 普通函数适配器

    作用:将普通函数当作函数对象处理,使之可以传入参数

    4. 成员函数适配器

    作用:

    03常用遍历算法

    for_each(iterator beg,iterator end,_callback)

     

    transform:

    transform 第一种情况: 一个容器种的元素经过运算 把结果放进目标容器中(b2)

     

    第二种情况:两个容器进行运算,把结果放到第三个容器中。

    4 常用 查找算法

    1. find算法:

    查找为相同值的第一个元素

    void test01() {

       

        vector<int> v;

     

        v.push_back(8);

        v.push_back(2);

        v.push_back(5);

        v.push_back(6);

       

        vector<int>::iterator pos = find(v.begin(), v.end(), 5);

        if (pos == v.end()) {

             cout << "没有找到!" << endl;

        }

        else {

             cout << "找到了:" << *pos << endl;

        }

    }

    2.find_if算法:

            查找是否有这个值

    class mycompare03 {

    public:

        bool operator()(int v) {

             return v > 2;

        }

    };

    void test03() {

        vector <int> v;

     

        v.push_back(8);

        v.push_back(2);

        v.push_back(5);

        v.push_back(6);

     

        /*

       

        */

        vector<int>::iterator pos = find_if(v.begin(), v.end(), mycompare03());

        if (pos == v.end()) {

             cout << "没有找到!" << endl;

        }

        else {

             cout << "找到了:" << *pos << endl;

        }

    }

    查找对象:

    需要重写== 方法:

    class student {

    public:

        student(int id, int age) :id(id), age(age) {};

        int id;

        int age;

     

     

        bool operator==(const student& s) {

             if (this->id == s.id && this->age == s.age) {

                 return true;

             }

             else

             { 

                 return false;

             }

     

             //return this->id == s.id && this->age == s.age;

        }

    };

    void test02() {

        vector<student> v;

        student s1(1, 2), s2(3, 4), s3(5, 6);

        v.push_back(s1);

        v.push_back(s2);

        v.push_back(s3);

        vector<student>::iterator pos = find(v.begin(), v.end(), s1);

       

        if (pos != v.end()) {

             cout << "找到:" << pos->id << " " << pos->age << endl;

        }

        else {

             cout << "没有找到!" << endl;

        }

    }

    3.adjacent_find算法:

     查找相邻的相同值元素 返回第一个元素的位置:

    void test04() {

        vector <int> v;

     

        v.push_back(8);

        v.push_back(2);

        v.push_back(2);

        v.push_back(5);

        v.push_back(6);

     

        vector<int>::iterator pos =  adjacent_find(v.begin(),v.end());

        if (pos == v.end())

        {

             cout << "没有找到" << endl;

        }

        else {

             cout << "找到:" << *pos << endl;

        }

    }

    4.binary_search

    二分查找法:

     需要原容器进行好排序

     void test05() {

     

        // binary_search需要对有序的元素进行查找

     

        vector <int> v;

        v.push_back(8);

        v.push_back(2);

        v.push_back(2);

        v.push_back(5);

        v.push_back(6);

     

        sort(v.begin(), v.end()); // 排序

     

        bool flag = binary_search(v.begin(), v.end(), 5);

     

        if (flag) {

             cout << "查找到!" << endl;

        }

        else {

             cout << "没有查找到!" << endl;

        }

     

    }

    5.count 算法 count_if算法

    // count count_if

    class mycompare06{

    public:

        bool operator()(int v) {

             return v > 2;

        }

    };

    void test06() {

     

        vector <int> v;

        v.push_back(8);

        v.push_back(2);

        v.push_back(2);

        v.push_back(5);

        v.push_back(6);

     

        // count算法

        int n = count(v.begin(), v.end(), 2);

        cout << "n:" << n << endl;

     

        // count_if

        n = count_if(v.begin(), v.end(), mycompare06());

        cout << "n:" << n << endl;

    };

    05常用排序算法

    排序算法:需要容器支持随机访问

    list不支持随机访问 所以list内部有一个自己的sort

    merge

    merge函数的作用是:将两个有序的序列合并为一个有序的序列

    sort

    random_shuffle

    reverse

    06常用的拷贝和替换算法

    copy: 将容器内指定范围的元素拷贝到另一容器中

    replace: 将容器内指定范围的旧元素修改为新元素

    replace_if: 将容器内指定范围满足条件的元素替换为新元素

    swap 交换两个容器的元素

    copy:

    replace, replace_if:

    swap:

    07上午课程回顾

    08 常用的算术生成算法

    accumulate 累加:

    (累加完最后加了100)

    fill 填充:

    09常用的集合算法

    求交集:set_intersection

    求并集:set_union

    求差集:set_difference

    10 distance_逆序遍历_修改容器元素(补充)

    distance 求两个迭代器之间的距离

    for_each修改容器元素的值

    for_each逆向遍历

    11 演讲比赛思路

    12演讲比赛框架搭建

    13演讲比赛实现

    14课程总体回顾

  • 相关阅读:
    初中几何
    角平分线导致的三角形内外角关系
    解方程
    初中|数学题目整理
    求一次函数解析式
    整式的四则运算
    分式方程
    做辅助线的方法
    线段相等的证明思路
    python2.7安装sqlite3模块
  • 原文地址:https://www.cnblogs.com/eret9616/p/10654744.html
Copyright © 2020-2023  润新知