<algorithm>头文件定义了一系列特别针对元素序列应用而设计的算法
序列是指一组可以通过迭代器或指针访问的一对象,例如一个数组或某种STL容器的实例。需要注意的是,这些算法都是通过迭代器直接操作值,而不会以任何方式作用到容器的结构上,算法永远都不会作用到容器的大小或分配的容量上。
<algorithm>中的函数
1、 不更改序列的操作
for_each
for_each(beg, end, func)
依次遍历元素,对迭代器范围中的每个元素执行func操作,。
find
find(beg, end, val)
find_if(beg, end, unarypred)
依次遍历元素,顺序查找迭代器范围中与val值相匹配或使得unarypred为真的元素,返回满足第一个匹配元素的迭代器,若无匹配元素,则返回end。
find_end
find_end(beg1, end1, beg2, end2)
find_end(beg1, end1, beg2, end2,unarypred)
依次遍历元素,在[beg1, end1)中查找最后一个匹配的子序列[beg2, end2),若存在,则返回beg2在[beg1, end1)中对应的迭代器,否则返回end1。[beg2, end2)中序列必须完全匹配。
例:vec1 –{1,2,3,4,5}, vec2{2,3,4}, vec3{3,2,4}
在vec1中查找vec2,则返回元素2在vec1中的迭代器。
在vec1中查找vec3,则返回vec1.end()迭代器。
find_first_of
find_first_of(beg1, end1, beg2, end2)
find_first_of(beg1, end1, beg2, end2, unarypred)
依次遍历元素,在[beg1, end1)中查找首次出现[beg2, end2)中的任一元素,使用==或unarypred相匹配。若存在,返回首个匹配的元素的迭代器,否则返回end1.
例:vec1 –{1,2,3,4,5}, vec2{3,2,4}, vec3{8,6,7}
在vec1中查找vec2,则返回元素2在vec1中的迭代器。
在vec1中查找vec3,则返回vec1.end()迭代器。
adjacent_find
adjacent_find(beg, end)
adjacent_find(beg, end, unarypred)
依次遍历元素,查范围内相邻元素,使用==或unarypred相匹配,若存在,返回第一个元素对应的迭代器,否则返回end.
count
count(beg, end, val)
count_if(beg, end, unarypred)
依次遍历元素,查找范围内与val相匹配或使unarypred为真的元素个数。
mismatch
mismatch(beg1, end1, beg2)
mismatch(beg1, end1, beg2, unarypred)
查找[beg1, end1)与 [beg2, end1-beg1+beg2)首个不匹配的项,返回pair<iterator1,iterator2>, iterator1对应序列1中迭代器,iterator2对应序列2中迭代器。使用==或unarypred匹配。调者必须保证迭代器beg2后续元素至少与[beg1, end1)一样多。
equal
equal(beg1, end1, beg2)
equal(beg1, end1, beg2, unarypred)
判断[beg1, end1)与[beg2, end1-beg1+beg2)是否匹配,返回false or true。使用==或unarypred匹配。调者必须保证迭代器beg2后续元素至少与[beg1, end1)一样多。
search
search(beg1, end1, beg2, end2)
search(beg1, end1, beg2, end2, unarypred)
依次遍历元素,在[beg1, end1)中查找第一个匹配的子序列[beg2, end2)。若存在,则返回beg2在[beg1, end1)中对应的迭代器,否则返回end1。[beg2, end2)中序列必须完全匹配。
search_n
search_n(beg1, end1, count, val)
search_n(beg1, end1, count, val, unarypred)
依次遍历元素,在[beg1, end1)中查找匹配val的元素,使用==或unarypred匹配。若存在,返回count指定的第count个元素所对应的迭代器,否则返回end1。若count指定值为负数或0,则返回beg1。
2、 修改序列的操作
copy
copy(beg1, end1, beg2)
copy_backward (beg1, end1, end2)
copy顺序拷贝[beg1, end1)范围内元素到以beg2开始的序列中。
copy_backward顺序拷贝[beg1, end1)范围内元素到以end2结束的序列中。copy [beg1, end1) backwards to [..., end2)
swap
swap(left, right)
iter_swap(iter1, iter2)
swap_ranges(beg1, end1, beg2)
swap互换两个对象。可以是序列或是元素。互换序列则包含的元素以及序列大小、容量等。
iter_swap类似,只是传入参数为迭代器,调用者必须保证两个迭代器均对应有值,不能传入end()迭代器。
swap_ranges互换[beg1, end1)与[beg2, end1-beg1+beg2)范围内元素。调用者必须保证迭代器beg2后续元素至少与[beg1, end1)一样多。
transform
transform(beg1, end1, dst, unarypred)
transform(beg1, end1, beg2, dst, unarypred)
对输入范围内元素执行指定操作,写入到以dst开始的序列中。
版本一对[beg1, end1)中元素执行一元操作unarypred。
版本二执行二元操作,[beg1, end1)中元素作为第一个实参,[beg2, end1-beg1+beg2)中元素作为第二个实参。
调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
replace
replace(beg1, end1, old_value, new_value)
replace_if(beg1, end1, unarypred, new_value)
replace_copy(beg1, end1, beg2, old_value, new_value)
replace_copy_if(beg1, end1, beg2, unarypred, new_value)
replace遍历[beg1, end1)中元素,将==old_value的元素替换为new_value
replace遍历[beg1, end1)中元素,将使得unarypred为真的元素替换为new_value
replace_copy拷贝[beg1, end1)中元素到以beg2开始的序列中,对==old_value的元素替换为new_value后再拷贝。调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
Replace_copy_if拷贝[beg1, end1)中元素到以beg2开始的序列中,对使得unarypred为真的元素替换为new_value后再拷贝。调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
fill
fill(beg1, end1, val)
fill_n(beg1, count, val)
fill顺序填充[beg1, end1)中所有元素为val
fill_n从beg1开始,顺序填充count个元素为val, 调用须保证从beg1始后续至少有count个元素(包括beg1)
generate
generate(beg1, end1, unarypred)
generate_n(beg1, count, unarypred)
generate顺序填充[beg1, end1)为unarypred()生成的元素,unarypred返回值需与序列模板一致
generate_n从beg1开始,顺序填充count个元素为unarypred()生成的值,调用须保证从beg1始后续至少有count个元素(包括beg1)
remove
remove(beg1, end1, val)
remove_if(beg1, end1, unarypred)
remove_copy(beg1, end1, beg2, val)
remove_copy_if(beg1, end1, beg2, unarypred)
remove/remove_if删除[beg1, end1)中匹配的元素,返回最后一个非匹配元素的下一个元素对应的迭代器。使用==与val匹配或使得unarypred为真匹配。注意:该操作并不会真正减少序列中的元素,执行操作后,仅将匹配元素去除并用非匹配项填充,序列中元素个数保持不变。如:
vec1{1,2,3,4,5} 删除2,则vec1变为{1,3,4,5,5},返回第二个5对应的迭代器
vec2{1,2,3,2,4},删除2,则vec2变为{1,3,4,2,4},返回2对应的迭代器
一般remove/remove_if操作配合erase操作使用
vec.erase(remove(vec.begin(), vec.end()), vec.end()) 真正删除匹配元素
remove_copy/remove_copy_if删除[beg1, end1)中匹配的元素,并将结果拷贝到以beg2开始的序列中,并返回beg2中拷贝元素下一个元素对应的迭代器。使用==与val匹配或使得unarypred为真匹配。调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
[beg1, end1)序列中元素个数及顺序不变。
实际上remove是采用remove_copy实现的:
template<class _FwdIt, class _Ty> inline _FwdIt remove(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) { // remove each matching _Val _First = find(_First, _Last, _Val); if (_First == _Last) return (_First); // empty sequence, all done else { // nonempty sequence, worth doing _FwdIt _First1 = _First; return (_STDEXT remove_copy (++_First1, _Last, _First, _Val)); } }
unique
unique(beg1, end1)
unique(beg1, end1, unarypred)
unique_copy(beg1, end1, beg2)
unique_copy(beg1, end1, beg2, unarypred)
注意:unique操作的序列必须为己排序的序列
unique去掉[beg1, end1)中重复元素,使用==或使unarypred为真匹配,序列后部分用原序列元素填充,返回最后一个非重复元素对应的迭代器。如:
vec1{1,2,2,3,4} ——> {1,2,3,4,4},返回第二个4对应的迭代器
vec2{1,2,2,3,3,4,4} ——> {1,2,3,4,3,4,4},返回第二个3对应的迭代器
一般用法:
sort(oVec1.begin(), oVec1.end());
oVec1.erase(unique(oVec1.begin(), oVec1.end()), oVec1.end());
unique_copy去掉[beg1, end1)中重复元素,并将结果拷贝到以beg2开始的序列中,并返回目标序列中最后一个拷贝元素下一个元素对应的迭代器。调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
[beg1, end1)序列中元素个数及顺序不变。
reverse
reverse(beg1, end1)
reverse_copy(beg1, end1, beg2)
reverse反向[beg1, end1)中的元素
reverse反向[beg1, end1)中的元素,将结果拷贝到以beg2开始的序中。调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
[beg1, end1)序列中元素个数及顺序不变。
rotate
rotate(beg, mid, end)
rotate_copy(beg1, mid1, end1,beg2)
rotate围绕mid表示的元素旋转。 mid处元素成为第一个元素,其次是[mid+1, end)的元素,最后是[beg, mid)的元素。
rotate_copy是保持输入序列不变,将旋转后的序列写入从beg2开始的目标序列中。调用者必须保证beg2、dst后续元素至少与[beg1, end1)一样多。
random_shuffle
random_shuffle(beg1, end1)
random_shuffle(beg1, end1, rand)
要求随机访问迭代器。打乱输入序列中的元素顺序。第二个版本接受随机数生成器,该函数必须接受并返回迭代器的difference_type值。
difference_type 是 signed 类型 , 表示迭代器差距, vector<int>:: difference_type = iter1-iter2.
partition
partition(beg1, end1, unarypred)
stable_partition(beg1, end1, unarypred)
partition将使得unarypred为真的元素移动到序列的前部分去,返回移动后第一个不满足条件的元素对应的迭代器。元素原有顺序会被打乱。
stable_partition将使得unarypred为真的元素移动到序列的前部分去,返回移动后第一个不满足条件的元素对应的迭代器。保持序列原有元素顺序。
3、 排序算法
sort
sort(beg1, end1)
sort(beg1, end1, unarypred)
stable _sort(beg1, end1)
stable_sort(beg1, end1, unarypred)
partial_sort(beg1, mid1, end1)
partial_sort(beg1, mid1, end1, unarypred)
partial_sort_copy (beg1, mid1, end1, beg2, end2)
partial_sort_copy (beg1, mid1, end1, beg2, end2, unarypred)
sort使用 < 或unarypred比较后排序。
stable_sort使用 < 或unarypred比较后排序, 保持相等元素的原有顺序
partial_sort对mid1 – beg1个元素排序,将结果放在[beg1,mid1),后半部分顺序不保证。该算法适合只取出序中满足排序条件的部分元素。
Partial_sort_copy将部分排序结果放到[beg2, end2)中,原序列顺序不变。
若end2 – beg2 >= end1 – beg1, 则将输入序列的元素全排序后放入输出序列中,返回输出序列中己排序最后一个元素的下一位置。
否则,只将输入序列中end2 – beg2个元素排序后放入输出序列中。返回end2。
nth_element
nth_element(beg, nth, end)
nth必须是一个迭代器,对应输入序列中的一个元素。执行作后,nth迭代器表示的元素的值就是:在整个序列是己排序的情况下该位置的值。同时序列中的值也在nth处划分,nth之前的都是较nth小的,之后的都是较大的。
4、 二分法查找
注意:下列算法的输入序列均须己排序。
lower_bound
lower_bound(beg, end, val)
lower_bound(beg, end, val, comp)
返回第一个可以将val插入到该位置而仍然保持顺序的迭代器,使用 < 或 comp比较。
upper_boud
upper_boud(beg, end, val)
upper_boud(beg, end, val, comp)
返回最后一个可以将val插入到该位置而仍然保持顺序的迭代器,使用 < 或 comp比较。
equal_range
equal_range(beg, end, val)
equal_range(beg, end, val, comp)
返回一个表示子范围的迭代器对,可以将val插入到该范围内而仍然保持顺序。
binary_search
binary_search(beg, end, val)
binary_search(beg, end, val, comp)
返回一个bool值,表示序列是否有与val匹配的值。若 x<y和y<x都获得假,或使得comp(x,y)和comp(y,x)都获假,则x==y.
5、 合并算法
注意:下列算法的输入序列均须己排序,同时保证输出序列有足够空间容纳输出元素。
merge
merge(beg1, end1, beg2, end2, dst)
merge(beg1, end1, beg2, end2, dst, comp)
merge将输入序列1与序列2合并后写入到dst中。
inplace_merge
inplace_merge(beg, mid, end)
inplace_merge(beg, mid, end, comp)
将同一序列中的两个相邻子序列合并为一个有序序列,将从beg到mid和从mid到end的子序列合并为从beg到end的序列。
includes
includes(beg1, end1, beg2, end2)
includes(beg1, end1, beg2, end2, comp)
若序1中包含序列2中的每一个元素,则返回true,否则返回false.
set_union
set_union(beg1, end1, beg2, end2, dst)
set_union(beg1, end1, beg2, end2, dst, comp)
set_intersection(beg1, end1, beg2, end2, dst)
set_intersection(beg1, end1, beg2, end2, dst, comp)
set_difference(beg1, end1, beg2, end2, dst)
set_difference(beg1, end1, beg2, end2, dst, comp)
set_symmetric_difference(beg1, end1, beg2, end2, dst)
set_symmetric_difference(beg1, end1, beg2, end2, dst, comp)
set_union合并两个序列中的元素,按 < 或 comp比较并去掉重复元素后,拷贝到dst中。
set_intersection取出两个序列中都存在的元素,按 < 或 comp 比较排序后拷贝到dst中。
set_difference取出序列1中存在但序列2中不存在的元素,按 < 或 comp 比较排序后拷贝到dst中。
set_symmetric_difference取出在仅在序列1中存在或仅在序列2中存在的元素,按 < 或 comp 比较排序后拷贝到dst中。
6、 堆算法(heap)
make_heap
make_heap(beg, end)
make_heap(beg, end, comp)
make_heap创建堆,使用 < 或 comp 比较。默认创建大顶堆。创建堆是进行堆排序的前提。
push_heap
push_heap(beg, end)
push_heap(beg, end, comp)
对堆的操作。将最后一个元素加入到堆中。使用 < 或 comp 比较。
一般用法
Vec.push_back(val);
push_heap(Vec.begin(), Vec.end());
pop_heap
pop_heap(beg, end)
pop_heap(beg, end, comp)
对堆的操作,将堆顶元素取出,放置到序列的最后。
sort_heap
sort_heap(beg, end)
sort_heap(beg, end, comp)
对堆的操作,进行堆排序。使用 < 或 comp 比较
7、 最大最小值(min/max)
min
min(val1, val2)
min(val1, val2, comp)
min_element(beg, end)
min_element(beg, end, comp)
min返回最小值,使用<或comp比较
min_element返回最小值对应的迭代器,使用<或comp比较
max
max(val1, val2)
max(val1, val2, comp)
max_element(beg, end)
max_element(beg, end, comp)
max返回最小值,使用<或comp比较
max_element返回最小值对应的迭代器,使用<或comp比较

浙公网安备 33010602011771号