《《C++ Primer》学习笔记(》学习笔记(28))Generic Algorithms
为每一种容器增加很多功能,显然是不合算的。实际上,库为所有的容器提供了通用的算法,来操作容器和容
器的元素。
查找元素、替换或移除值、重新排序……都属于这一范畴。
10.1 Overview
----------------------------------------------------------------
使用这些算法时,请包含下面的头文件:
#include <algorithm>
#include <numeric>
算法并不直接作用于容器,而是作用于容器的迭代器,比如:
int val = 42;
auto result = find(vec.begin(), vec.end(), val);
(???此处使用cbegin和cend会报错。)
有了迭代器,独立于容器的算法才成为可能。
算法虽然独立于容器,但是它依赖于容器的元素类型。
算法不会执行容器的operations,它不会增加或删除容器的元素。
10.2 A First Look at the Algorithms
----------------------------------------------------------------
虽然库提供了100多种算法,但是它们和容器类似,具备一致的结构,易于理解和使用。
1. 有一些算法是只读的,比如find、count和accumulate。
auto result3 = accumulate(vch.begin(), vch.end(), 0);
string sum = accumulate(v.begin(), v.end(), string(""));
(accumulate的第三个参数类型,确定了相加之和的类型。)
还有一种只读的算法是equal:
equal = (roster1.begin(), roster1.end(), roster2.begin());
roster1和roster2的容器类型可以不一样,只要它们的元素可以比较即可。
2. 有一些算法是可写的,比如fill或fill_n:
fill(vec.begin(), vec.end(), 10);
一般来说,算法无法添加或者删除元素,但是使用insert iterator可以。
back_inserter使用容器的引用作为参数,返回insert iterator,从而调用push_back方法:
auto it = back_inserter(vch);
*it = 5;
我们可以使用back_inserter来创建迭代器,用作算法的destination:
fill_n(back_inserter(vch), 5, 7);
for (auto &r : vch)
cout << r << endl;
copy、replace也是可写的算法。