C++ STL之algorithm

本文深入解析C++标准库中的Algorithm组件,包括accumulate、for_each、replace等算法的使用方法及内部实现原理,同时探讨了不同容器如何运用这些算法。

1. Algorithm 算法

  1. 算法Algorithm是function template
  2. 算法通过操作迭代器来对容器进行操作
  3. c++ algorithm形式:像count_if这样的,在std命名空间并以迭代器为参数利用迭代器与容器沟通的形式
    在这里插入图片描述

1.1 算法源代码剖析

1.1.1 accumulate
  1. accumulate有两个版本,第一个版本实现两个迭代器之间的元素的累加并将值加到初值init上;第二个版本允许传入一个二元运算规则,按该运算规则进行运算。如图所示,第二个版本可以传入一个可调用对象
    在这里插入图片描述
1.1.2 for_each
  1. 对指定范围内的元素做一件指定的事情
  2. 如图所示,for_each接受两个迭代器和一个可调用对象
    在这里插入图片描述
    int main() {
        vector<int> v{1,2,3,4,5};
        //lambda表达式生成一种函数对象
        for_each(v.begin(), v.end(), [](int &item) {
            cout << item << " ";
        });
    }
    
1.1.3 replace、replace_if、replace_copy
  1. replace遍历指定范围,将等于旧值的值替换为新值
  2. replace_if遍历指定范围,将满足条件的值替换为新值
  3. replace_copy遍历指定范围,将等于旧值的对象都以新值放至新的区间,不等于的按原值放入新区间
    在这里插入图片描述
1.1.4 count,count_if
  1. count遍历指定范围,若值等于指定值,n++,最后返回n
  2. count_if遍历指定范围,若值满足条件,n++,最后返回n
  3. array、vector、list、forward_list、deque不带成员函数count,采用std的标准算法版本
  4. set/multiset、map/multimap、unoreded_set/unoreded_multiset、unoreded_map/unoreded_multimap带有成员函数count(这八个是关联容器),采用自带的成员函数count
    在这里插入图片描述
1.1.5 find、find_if
  1. find、find_if是循序式查找,效率低
  2. array、vector、list、forward_list、deque不带成员函数find,采用std的标准算法版本
  3. set/multiset、map/multimap、unoreded_set/unoreded_multiset、unoreded_map/unoreded_multimap带有成员函数find,采用自带的成员函数find效率高
    在这里插入图片描述
1.1.6 sort
  1. 对范围内的元素进行排序
  2. array、vector、deque不带成员函数sort,采用std的标准算法版本,set/multiset、map/multimap、unordered_set/unordered_multiset、unordered_map/unordered_multimap也不带成员函数sort,因为本身就是有序的
  3. list、forward_list带有成员函数sort,因为std版本的sort要求iterator的类型是random_access_iterator_tag,调用std版本的sort会出错,即:标准库算法不会通吃所有的容器
1.1.7 reverse iterator, rbegin(), rend()
  1. reverse_iterator常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素,在adapter适配器章节会进一步解释
    在这里插入图片描述
1.1.8 binary_search
  1. 使用二分查找之前要先排序
  2. 实现方式是调用lower_bound(lower_bound返回大于等于target的第一个位置,upper_bound返回大于target的第一个位置)来实现
    在这里插入图片描述
    int main()
    {
        vector<int> v{1,2,2,3,4};
        cout << upper_bound(v.begin(), v.end(), 2) - v.begin() << endl;
        cout << lower_bound(v.begin(), v.end(), 2) - v.begin();
    }
    

    输出:

    3
    1
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值