泛型算法本身不会执行容器的的操作,他们只会运行于迭代器上,执行迭代器的操作。所以算法永远不会改变底层容器的大小,但可能改变容器中元素的值,也可能在容器中移动元素,但永远不会直接添加和删除元素。但标准库定义了一类特殊的迭代器,称为插入迭代器,这种迭代器赋值是,他们会在底层容器上执行插入操作。因此算法可以利用插入迭代器完成向容器中添加元素的操作,但算法本身永远不会做这样的操作。
大多数算法都定义在头文件algorithm中,numeric中也定义了一组数值泛型算法
1. 只读算法
只读取元素值,不改变元素,对于这类算法,通常最好使用cbegin()和cend()
find: auto result = find(vec.cbegin(), vec.cend(), val); //在容器中查找指定的元素值,结果返回指向查找到的元素的迭代器,如果未找到,返回vec.end() (起始迭代器,终止迭代器,查找的元素值)
count: int num = count(vec.cbegin(), vec.cend(), val); //返回给定值在序列中出现的次数
accumulate:int sum = accumulate(vec.cbegin(), vec.cend(), 0); //对元素进行求和 (起始迭代器,终止迭代器,和的初始值)
equal: bool result = equal(roster1.cbegin(), roster1.cend(), roster2.cbegin()); //用于确定两个序列是否保存相同的值,roster2中的元素数目应该至少与roster1一样多
find_if: find_if(vec.cbegin(), vec.cend(0, 一元谓词); //返回第一个使谓词返回非0值的元素,如果不存在则返回尾迭代器
2. 写容器元素的算法
fill: fill(vec.begin(), vec.end(), 0); //将每个元素重置为0
fille_n: fille_n(vec.begin(), vec.size(), 0) //将所有元素重置为0,这里不检查容器的大小是否超过限定
一种有意思的用法:插入迭代器,fill_n(back_inserter(vec), 10, 0); //相当于在容器尾部插入10个值为0 的元素
copy: auto ret = copy(begin(a1), end(a1), begin(a2)); //将数组a1中的内容拷贝到a2中,ret指向a2的尾元素之后的值
replace: replace(ilst.begin(), ilst.end(), 0, 42); //将容器中的值为0的元素值替换为42
replace_copy: replace_copy(ilst.begin(), ilst.end(), back_inserter(ivec), 0, 42); //不更改原序列,将原序列拷贝到ivec中,并将ivec中的值为0的元素替换为42
3. 重排容器元素的算法
sort: sort(vec.begin(), vec.end()); //重排输入序列中的元素,使之有序,是利用元素的<运算符来实现排序
unique: auto end_unique = unique(vec.begin(), vec.end()); //重排输入范围,使得不重复的元素出现在vec的开始部分,并返回不重复区域之后一个位置的迭代器
stable_sort: 保持原来顺序进行排序
for_each: for_each(vec.begin(), vec.end(), 可调用表达式); //对输入序列中每个元素调用此表达式对象
transform: transform(vec1.begin, vec1.end(), vec2.begin(), 可调用表达式); //前两个迭代器表示输入序列,第三个迭代器表示目的位置,算法对输入序列中每个元素调用可调用对象,并将结果写到目的位置。目的位置的迭代器与输入位置的迭代器可以相同