版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winter_wu_1998/article/details/85261523
-
find算法
- find(begin, end, val)
- find_if(begin, end, func)
- 一般用来搜索无序容器,**binary_search()**搜索有序容器
- find() 返回首次出现的元素所在位置的迭代器,如果没找到返回 end()
- 如果想要寻找的不是一个具体的值,而是满足某一规则的值,则应该选择find_if算法
- find_end搜索最后一次出现的地点
//避免重复查找 while((iter = find(iter, vec.end(), val)) != vec.end()) {...}
-
sort算法
- sort(begin, end [, func])
- STL中的 sort算法在数据较小时采用插入排序,递归深度过高时采用堆排序,否则采用快排
- 因为递归需要用到栈空间,而占空间大小有限,所以递归过深时会栈溢出
- 数据大不一定递归深度大
- sort算法能用于随机迭代器(比如vector的),而list,set等容器由于没有随机迭代器,不能对其使用sort
- list有自己的sort方法
- stable_sort提供稳定排序
-
equal算法
- equal(begin1, end1, begin2 [,func])
//由于假定两个序列长度相等,所以第二个序列只需传入开始迭代器 bool euqal(begin1, end1, begin2); //可以利用equal算法和逆序迭代器判断单词回文 bool isPalindrome(const string& s) { return equal(s.begin(), s.end(), s.rbegin()); }
-
max算法
- max(val1, val2)
- 两个比较的数据需要类型相同,比如unsigned int 和 int 无法比较,必须显式类型转换
-
accumulate算法
- accumulate(begin, end, startVal [, func])
- 可选参数func可以指定运算规则
- 这个算法存在的缺陷是依赖startVal的类型,该类型作为其累加器的类型
- 比如如果该类型是Int, 但是迭代器指向的值是double,则所有double类型的值都会被截断小数部分
//product值为3268800 = 10! vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int product = accumulate(v.begin(), v.end(), multipiles<int>()); // 连接一个vector<string>对象vec中的所有元素 string t(""); accumulate(vec.begin(), vec.end(), t);
-
transform算法
- transform(begin, end, dest, rule)
- 通过back_inserter(dest) 确保目的地有足够的空间保存输入
- rule函数将应用到输入序列的每个元素松二获得输出序列
-
for_each算法
- for_each(begin, end, func)
- 对范围内的每个元素应用func运算,比如print
- 此算法不可更改元素值,否则应该使用 transform算法
-
reverse算法
- reverse(begin, end)
//反转所有元素算法的实现代码 template<typename It> void reverse(It begin, It end) { while(begin != end && begin != --end) swap(*begin++, end); }
-
copy算法
- copy(begin, end, dest)
- copy_if(begin, end dest, func)
- 通过back_inserter(dest) 确保目的地有足够的空间保存输入
- copy_if复制满足一定规则的元素
-
copy_backward算法
- copy_bakcward(begin, end, dest_end)
- 和copy算法不同之处在于copy给出目标开始地址,而该算法给出目标结束地址
- 适用于只知道结束地址而不知道开始地址的情况
-
lexicographical_compare算法
- lexicographical_compare(begin1, end1, begin2, end2 [, func])
- 若第一个范围中对应位置的每个值都小于第二个,则返回true
-
partition算法
- partition(begin, end, func)
- func函数返回true则放在容器前面,false则放在后面
- 返回值为第一个func返回false的元素的迭代器
- stable_partition为稳定版本
-
remove算法
- remove(begin, end, val)
- remove_if(begin, end, func)
- 不可用于关联容器
-
search算法
- search(begin, end, sub_begin, sub_end [, func])
- 如果存在子序列,返回子序列的第一个元素的迭代器,否则返回end()
拾遗
- 许多改变容器内容的算法都提供两个版本,一个为 in-place 版本,一个为 copy版本
- copy版本名称都有 _copy后缀,且多一个迭代器参数,指向目标容器头
- 很多算法都有根据具体值判断和根据函数判断两个版本,后者名称都有 _if后缀