stl算法采用覆盖模式,而不是插入模式。所以调用者必须保证目标区间拥有足够的元素空间。也可以用特殊的插入型迭代器来解决这个问题。
非变动性算法
名称 | 作用 |
---|---|
for_each | 对每个元素执行某项操作 |
count | 返回元素个数 |
count_if | 返回满足某一准则的元素个数 |
min_element | 返回最小值 |
max_element | 返回最大值 |
find | 搜寻等于某个值的第一个元素 |
find_if | 搜寻满足某一准则的第一个元素 |
search_n | 搜寻具有某特性的第一段n个连续元素 |
search | 搜寻某个子区间第一次出现的位置 |
find_end | 搜寻某个子区间最后出现的位置 |
find_first_of | 搜寻等于某数个值之一的第一个元素 |
adjacent_find | 搜寻连续两个相等(符合特定准则)的元素 |
equal | 判断两个区间是否相等 |
mismatch | 返回两个序列的各组对应元素中,第一队不相等元素 |
lexicographical_compare | 判断某一序列在字典顺序下是否小于另一序列 |
非变动性算法既不改变元素次序,也不改动元素值。
变动性算法
名称 | 作用 |
---|---|
for_each | 对每个元素执行某项操作 |
copy | 从第一个元素开始,复制某段区间 |
copy_backward | 从最后一个元素开始,复制某段区间 |
transform | 变动并复制元素,将两个区间元素合并 |
merge | 合并两个区间 |
swap_ranges | 交换两区间内的元素 |
fill | 以给定值替换每一个元素 |
fill_n | 以给定值替换n个元素 |
generate | 以某项操作的结果替换每个元素 |
generate_n | 以某项操作的结果替换n个元素 |
replace | 将具有某特定值的元素替换为另一个值 |
replace_if | 将符合某准则的元素替换为另一个值 |
replace_copy | 复制整个区间,同时并将具有某特定值的元素替换为另一个值 |
replace_copy_if | 复制整个区间,同时并将符合某准则的元素替换为另一个值 |
变动性算法,要不直接改变元素值,要不就是在复制到另一区间的过程中改变元素值。
关联式容器的元素被视为常数,所以不能将关联式容器当做变动性算法的目标区间
for_each 与 transform 改变元素值
// 传入引用来改变值
void ForEach(int& elem)
{
elem = elem * elem;
}
// 通过返回值来改变值
int FnTransform(int elem)
{
return elem * elem;
}
vector<int> coll;
for (int ia = 0; ia < 10; ++ia)
{
coll.push_back(ia);
}
for_each(coll.begin(), coll.end(), ForEach);
PrintElem(coll);
// 0 1 4 9 16 25 36 49 64 81
transform(coll.begin(), coll.end(), coll.begin(), FnTransform);
PrintElem(coll);
// 0 1 16 81 256 625 1296 2401 4096 6561
移除性算法
名称 | 作用 |
---|---|
remove | 将等于某特定值的元素全部移除 |
remove_if | 将满足某准则的元素全部移除 |
remove_copy | 将不等于特定值的元素全部复制到其他处 |
remove_copy_if | 将不满足某准则的元素全部复制到他处 |
unique | 移除毗邻的重复元素 |
unique_copy | 移除毗邻重复元素,并复制到它处 |
移除性算法只是在逻辑上移除元素:将不需要被移除的元素往前面覆盖应被移除的元素。因此它不会改变操作区间的元素个数,而是返回逻辑新的终点位置。
变序性算法
名称 | 作用 |
---|---|
reverse | 将元素次序逆转 |
reverse_copy | 复制的同时,逆转元素顺序 |
rotate | 旋转元素次序 |
rotate_copy | 复制的同时,旋转元素次序 |
next_permutation | 得到元素的下一个排列次序 |
prve_permutation | 得到元素的上一个排序次序 |
random_shuffle | 将元素的次序随机打乱 |
partition | 改变元素次序,使符合某准则者移到前面 |
stable_partition | 与partition相似,但保持符合准则与不符合准则各个元素之间的相对位置 |
变序性算法通过元素的赋值和交换,改变元素次序。变序行算法也不能以关联式容器作为目标。
排序算法
名称 | 作用 |
---|---|
sort | 对所有元素排序,内部采用quicksort,复杂度为n*log(n) |
stable_sort | 对所有元素排序,并保持相等元素间的相对次序,内部采用mergesort,内存足够时为n*log(n),否则为n*log(n)*log(n) |
partial_sort | 排序,直到前n个元素就位,内部采用heapsort,任何情况保证n*log(n) |
partial_sort_copy | 排序,直到前n个元素就位,结果复制到它处 |
nth_element | 根据第n个位置进行排序 |
partition | 改变元素次序,使符合某准则者移到前面 |
stable_partition | 与partition相似,但保持符合准则与不符合准则各个元素之间的相对位置 |
make_heap | 将一个区间转换成一个heap |
push_heap | 将元素加入一个heap |
pop_heap | 从heap移除一个元素 |
sort_heap | 对heap进行排序,执行后就不再是个heap了 |
排序算法是一种特殊的变序行算法,比一般的变序行算法复杂,花费更多时间,需要动用随机存取迭代器。
已序区间算法
名称 | 作用 |
---|---|
binary_search | 判断某区间是否包含了某个元素 |
includes | 判断某区间的每一个元素是否都涵盖于另一个区间 |
lower_bound | 搜寻第一个大于等于给定值的元素 |
upper_bound | 搜寻第一个大于给定值的元素 |
equal_range | 返回等于给定值的所有元素构成的区间 |
merge | 将两个区间元素合并 |
set_union | 求两个区间的并集 |
set_intersection | 求两个区间的交集 |
set_difference | 求位于第一区间但不位于第二区间的所有元素,形成一个已序的区间 |
set_symmetric_difference | 找出只出现两个区间之一的所有元素,形成一个已序区间 |
inplace_merge | 将两个连续的已序区间合并 |
数值算法
名称 | 作用 |
---|---|
accumulate | 组合所有元素(求总和,求乘积) |
inner_product | 组合两区间内的所有元素 |
adjacent_difference | 将每个元素和其前一个元素组合 |
partial_sum | 将每个元素和其先前的所有元素组合 |