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

1.1 算法源代码剖析
1.1.1 accumulate
- accumulate有两个版本,第一个版本实现两个迭代器之间的元素的累加并将值加到初值init上;第二个版本允许传入一个二元运算规则,按该运算规则进行运算。如图所示,第二个版本可以传入一个可调用对象。

1.1.2 for_each
- 对指定范围内的元素做一件指定的事情
- 如图所示,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
- replace遍历指定范围,将等于旧值的值替换为新值
- replace_if遍历指定范围,将满足条件的值替换为新值
- replace_copy遍历指定范围,将等于旧值的对象都以新值放至新的区间,不等于的按原值放入新区间

1.1.4 count,count_if
- count遍历指定范围,若值等于指定值,n++,最后返回n
- count_if遍历指定范围,若值满足条件,n++,最后返回n
- array、vector、list、forward_list、deque不带成员函数count,采用std的标准算法版本
- set/multiset、map/multimap、unoreded_set/unoreded_multiset、unoreded_map/unoreded_multimap带有成员函数count(这八个是关联容器),采用自带的成员函数count

1.1.5 find、find_if
- find、find_if是循序式查找,效率低
- array、vector、list、forward_list、deque不带成员函数find,采用std的标准算法版本
- set/multiset、map/multimap、unoreded_set/unoreded_multiset、unoreded_map/unoreded_multimap带有成员函数find,采用自带的成员函数find效率高

1.1.6 sort
- 对范围内的元素进行排序
- array、vector、deque不带成员函数sort,采用std的标准算法版本,set/multiset、map/multimap、unordered_set/unordered_multiset、unordered_map/unordered_multimap也不带成员函数sort,因为本身就是有序的
- list、forward_list带有成员函数sort,因为std版本的sort要求iterator的类型是random_access_iterator_tag,调用std版本的sort会出错,即:标准库算法不会通吃所有的容器
1.1.7 reverse iterator, rbegin(), rend()
- reverse_iterator常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素,在adapter适配器章节会进一步解释

1.1.8 binary_search
- 使用二分查找之前要先排序
- 实现方式是调用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
本文深入解析C++标准库中的Algorithm组件,包括accumulate、for_each、replace等算法的使用方法及内部实现原理,同时探讨了不同容器如何运用这些算法。



1124

被折叠的 条评论
为什么被折叠?



