gisdemo

分享,更是学习

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

<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比较

posted on 2013-10-14 19:27  gisdemo  阅读(520)  评论(0)    收藏  举报