0.通用描述
beg和end:表示元素范围的迭代器。几乎所有算法都带有由二者组成的序列。
beg2和end2:表示第二个输入序列开始和结束位置的迭代器,部分算法只有beg2。由用户保证beg2开始的范围至少和beg和end所表示的范围一样长(即不会越界)。beg和beg2类型无需匹配,但需要保证都能执行特定操作或调用给定的可调用对象。
dest:表示目的序列的迭代器。由用户保证以dest开始的范围有足够的长度(即不会越界)。
unaryPred和bianryPred:分别是一元和二元谓词,分别接受一个和两个参数,都是来自输入序列的元素,两个谓词都返回可用作条件的类型(如bool)。
comp:是一个二元谓词,满足关联容器中对关键字序的要求。
unaryOp和binaryOp:是可调用对象,可分别使用来自输入序列的一个和两个实参来调用。
1.查找对象的算法
在一个输入序列中搜索指定值或一个值的序列。
不带谓词的版本使用底层类型的相等运算符(==)来比较元素;带谓词的版本使用用户给定的一元或二元谓词来比较元素。
简单查找
find(beg, end, val)
find_if(beg, end, unaryPred)
find_if_not(beg, end, unaryPred)
count(beg, end, val)
count_if(beg, end, val)
all_of(beg, end, unaryPred)
any_of(beg, end, unaryPred)
none_of(beg, end, unaryPred)
查找重复值
adjacent_find(beg, end)
adjacent_find(beg, end, bianryPred)
search(beg, end, count, val)
search_n(beg, end, count, val, bianryPred)
查找子序列
search(beg1, end1, beg2, end2)
search(beg1, end1, beg2, end2, bianryPred)
find_first_of(beg1, end1, beg2, end2)
find_first_of(beg1, end1, beg2, end2, bianryPred)
find_end(beg1, end1, beg2, end2)
find_end(beg1, end1, beg2, end2, bianryPred)
2.其他只读算法
不带谓词的版本使用底层类型的相等运算符(==)来比较元素;带谓词的版本使用用户给定的一元或二元谓词来比较元素。
for_each(beg, end, unaryOp)
mismatch(beg1, end1, beg2)
mismatch(beg1, end1, beg2, bianryPred)
equal(beg1, end1, beg2)
equal(beg1, end1, beg2, bianryPred)
3.二分搜索算法
假如提供随机访问迭代器,性能会好很多。
不带谓词的版本使用元素类型的小于运算符(<)来比较元素;带谓词的版本使用用户给定的比较操作。
lower_bound(beg, end, val)
lower_bound(beg, end, val, comp)
upper_bound(beg, end, val)
upper_bound(beg, end, val, comp)
equal_range(beg, end, val)
equal_range(beg, end, val, comp)
binary_search(beg, end, val)
binary_search(beg, end, val, comp)
4.写容器元素的算法
可调用对象Gen()用于生成新值。
只写不读元素
fill(beg, end, val)
fill_n(dest, cnt, val)
generate(beg, end, Gen)
generate(dest, cnt, Gen)
使用输入迭代器
copy(beg, end, dest)
copy_if(beg, end, dest, unaryPred)
copy_n(beg, n, dest)
move(beg, end, dest)
transform(beg, end, dest, unaryOp)
transform(beg, end, beg2, dest, binaryOp)
replace_copy(beg, end, dest, old_val, new_val)
replace_copy_if(beg, end, dest, unaryPred, new_val)
merge(beg1, end1, beg2, end2, dest)
merge(beg1, end1, beg2, end2, dest, comp)
使用前向迭代器
iter_swap(iter1, iter2)
swap_ranges(beg1, end1, beg2)
replace(beg, end, old_val, new_val)
replace_if(beg, end, unaryPred, new_val)
使用双向迭代器
copy_backward(beg, end, dest)
move_backward(beg, end, dest)
inplace_merge(beg, mid, end)
inplace_merge(beg, mid, end, comp)
5.划分与排序算法
稳定版本保证保持相等元素的相对顺序,可能比不稳定版本慢得多并消耗更多内存。
划分
is_partitioned(beg, end, unaryPred)
partition_copy(beg, end, dest1, dest2, unaryPred)
partition_point(beg, end, unaryPred)
stable_partition(beg, end, unaryPred)
partition(beg, end, unaryPred)
排序
sort(beg, end)
stable_sort(beg, end)
sort(beg, end, comp)
stable_sort(beg, end, comp)
is_sorted(beg, end)
is_sorted(beg, end, comp)
is_sorted_until(beg, end)
is_sorted_until(beg, end, comp)
partition_sort(beg, mid, end)
partition_sort(beg, mid, end, comp)
partition_sort_copy(beg, end, destBeg, destEnd)
partition_sort_copy(beg, end, destBeg, destEnd, comp)
nth_element(beg, nth, end)
nth_element(beg, nth, end, comp)
6.通用重排操作
稳定版本保证保持相等元素的相对顺序,可能比不稳定版本慢得多并消耗更多内存。
Uniform_rand需要满足均匀分布随机数生成器的要求。
使用前向迭代器
remove(beg, end, val)
remove_if(beg, end, unaryPred)
remove_copy(beg, end, dest, val)
remove_copy_if(beg, end, dest, unaryPred)
unique(beg, end)
unique(beg, end, binaryPred)
unique_copy(beg, end, dest)
unique_copy_if(beg, end, dest, binaryPred)
rotate(beg, mid, end)
rotate_copy(beg, mid, end, dest)
使用双向迭代器
reverse(beg, end)
reverse_copy(beg, end, dest)
使用随机访问迭代器
random_shuffle(beg, end)
random_shuffle(beg, end, rand)
shuffle(beg, end, Uniform_rand)
7.排列算法
生成序列的字典序排列。算法假定序列中的元素都是唯一的。算法要求双向迭代器。
is_permutation(beg1, end1, beg2)
is_permutation(beg1, end1, beg2, binaryPred)
next_permutation(beg, end)
next_permutation(beg, end, comp)
prev_permutation(beg, end)
prev_permutation(beg, end, comp)
8.有序序列的集合算法
实现了有序序列上的一般集合操作,与标准库set不同(不要混淆)。算法提供了普通顺序容器的类集合行为。
每种算法都有重载版本,第一个使用元素类型的<运算符,第二个使用给定的比较操作。
includes(beg, end, beg2, end2)
includes(beg, end, beg2, end2, comp)
set_union(beg, end, beg2, end2, dest)
set_union(beg, end, beg2, end2, dest, comp)
set_difference(beg, end, beg2, end2, dest)
set_difference(beg, end, beg2, end2, dest, comp)
set_symmetric_difference(beg, end, beg2, end2, dest)
set_symmetric_difference(beg, end, beg2, end2, dest, comp)
9.最小值和最大值
使用元素类型的<运算符或给定的比较操作。第一组算法对值而非序列进行操作。第二组算法接收一个序列,他们要求输入迭代器。
min(val1,val2)
min(val1,val2, comp)
min(init_list)
min(init_list, comp)
max(val1,val2)
max(val1,val2, comp)
max(init_list)
max(init_list, comp)
min_max(val1,val2)
min_max(val1,val2, comp)
min_max(init_list)
min_max(init_list, comp)
min_element(beg, end)
min_element(beg, end, comp)
max_element(beg, end)
max_element(beg, end, comp)
minmax_element(beg, end)
minmax_element(beg, end, comp)
lexicographical_compare(beg1, end1, beg2, end2)
lexicographical_compare(beg1, end1, beg2, end2, comp)
10.数值算法
要求输入迭代器;如果算法输出数据,则使用输出迭代器表示目的位置。
accumulate(beg, end, init)
accumulate(beg, end, init, binaryOp)
inner_product(beg1, end1, beg2, init)
inner_product(beg1, end1, beg2, init, binOp1, binOp2)
partial_sum(beg, end, dest)
partial_sum(beg, end, dest, binaryOp)
adjacent_difference(beg, end, dest)
adjacent_difference(beg, end, dest, binaryOp)
iota(beg, end, val)
参考资料:
C++ Primer 中文版(第五版)