动机
容器定义了自己的成员函数,但是很多操作都是通用的,可以通过一套算法。用于不同类型的容器,多好。
#include<algorithm>
#include<numeric> //一些数值泛型
算法本质通过迭代器访问元素
1.算法执行容器的操作,执行的是迭代器的操作,所以不会更改底层的容器的大小,即不会增加或删除元素。
2.算法依赖容器元素类型的一些操作,比如find函数得需要元素类型支持比较操作。
算法分类
1.只读算法
1.equal算法不要求容器类型,元素类型必须一致,但是得可以比较。
equal(roster1.cbegin(), roster1.cend(), roster2.cbegin()); //roster1可以是vector<string>, roster2可以是list<const char*>
2.写算法
有些算法有copy版本,即创建一个新序列,在新序列上更改
replace(list.begin(), list.end(), 0 ,42); //把是0的地方换为42
replace_copy(list.cbegin(), list.cend(), back_inserter(ivec), 0 ,42); //ivec是list的拷贝,然后在ivec上操作
3.排序算法
1.sort函数使用元素类型的<运算符
2.sort还是unique都不能删除元素,想删除调用容器的操作。
void elimDups(vector<string> &words)
{
sort(words.begin(), words.end());
auto end_unique = unique(words.begin(), words.end()); //end_unique不是引用
cout<<typeid(end_unique).name()<<endl; // N9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEE 什么玩意
words.erase(end_unique, words.end()); //words.end()返回的是引用
}
4.返回类型
上面的auto貌似不是引用类型的,所以泛型算法貌似不返回引用啊,容器里的操作倒是返回引用。