10.2 初识泛型算法
C++标准库提供的算法有100多个,一下子记不住这么多,我们可以辅助记忆。
大部分的算法接收两个参数表示可以操作的范围,这个范围叫做输入范围。
(其实我觉得也可以叫做迭代器范围)
泛型算法根据对元素的操纵方式分为
是否读取元素、改变元素、或是否重排元素。根据这些可以对算法进行大致划分。
10.2.1 只读算法
accumulate算法
accumulate(iter1,iter2,初始值)
该算法对输入范围内的元素进行累加操作,其中初始值类型和传入的容器元素类型可以不一致,只要容器中元素的类型可以转化为初始值类型也可以
这句话要记住,accumulate算法返回值类型以及在算法中使用的运算符都是使用初始值类型的。
vector<int> vec = {
1,2,3,2134,3214,123,4,123,321,312,3,123,12,3,12,31,23,12};
long value = 0;
//元素类型和初始值类型是一样的,或者说元素类型可以转化为初始值类型
//泛型算法返回值类型的是初始值类型且会调用初始值类型的运算符
auto sum = std::accumulate(vec.begin(),vec.end(),value);
对于accumulate的操作,这里我的理解是元素类型先转化为初始值类型,再进行累加 ,即使用+运算符。
对于以下的代码:
vector<string> str_vec = {
"123","321","233","xx","gg"};
auto str_sum = std::accumulate(str_vec.begin(), str_vec.end(),"");
先把string类型转化为const char* ,然后使用const char* 的+运算符。
但是const char* 没有+运算符,所以程序编译报错。
equal算法
equal(容器1输入范围1,容器1输入范围2,容器2输入范围1)
equal判断两个输入范围内的元素是否相等,因为传入的是迭代器,所以两个容器类型可以不一致,两个容器内的元素也可以不一致,只要可以执行==运算符即可。
这类算法接收三个参数,前两个参数输入容器1的输入范围,后一个参数输入容器2的首元素。因为容器2只输入了首元素,所以这类算法都假定容器2中元素的个数大于等于容器1的元素个数。
而另一些方法可以接收四个参数,这也可以输入两个完整的输入范围。
练习
10.3
vector<int> vec = {
1,2,3,2134,3214,123,4,123,321,312