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课程总体回顾

转载于:https://www.cnblogs.com/eret9616/p/10654744.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值