常用指数:*****
C++11之后范围for循环提供了更大的方便
不会改变元素值和元素次序
difference_type count(beg, end, const T& value)/difference_type count_if(beg, end, op)
ForwardIterator min_element(beg, end)/min_element(beg, end, op)/max_element(beg, end)/max_element(beg, end, op)/pair
检验相等性:bool equal(beg, end, cmpBeg)/equal(beg, end, cmpBeg, op)
测试不定序的相等性(C++11):bool is_permutation(beg1, end1, beg2)/is_permutation(beg1, end1, beg2, op)
查找第一处不同:pair
用以检验区间:始自C++11,用来检验某个给定区间是否符合某条件
检验是否排序:bool is_sorted(beg, end) / bool is_sorted(beg, end, op) / ForwardIterator is_sorted_until(beg, end) / ForwardIterator is_sorted_until(beg, end, op)
检验是否被分割:使用op(elem1, elem2),elem1小于elem2时返回true
OutputIterator copy(sourceBeg, sourceEnd, destBeg)
:destBeg不能在[sourceBeg, sourceEnd)之间(常用指数:*****)OutputIterator copy_if(sourceBeg, sourceEnd, destBeg, op)
:源区间和目标区间不可重叠OutputIterator copy_n(sourceBeg, Size num, destBeg)
BidirectionalIterator2 copy_backward(BidirectionalIterator1 sourceBeg, BidirectionalIterator1 sourceEnd, BidirectionalIterator2 destEnd)
:destEnd不可处于(sourceBeg, sourceEnd]区间
OutputIterator move(InputIterator sourceBeg, InputIterator sourceEnd, OutputIterator destBeg)
BidirectionalIterator2 move_backward(BidirectionalIterator1 sourceBeg, BidirectionalIterator1 sourceEnd, BidirectionalIterator2 destBeg)
OutIter transform(InIter beg, InIter end, OutIter destBeg, op)
:将源区间的元素转换到目标区间OutIter transform(InIter beg, InIter end, Initer sourceBeg, InputIter sourceEnd, op)
:将两个源序列中的元素合并后写到目标区间ForwardIterator remove(ForwardIterator beg, ForwardIterator end, const T& value)
:移除区间内与value相等的元素ForwardIterator remove_if(ForwardIterator beg, ForwardIterator end, op)
:移除区间中每个令op(elem)为true的元素
1.对所有元素排序:
• sort(first, end)/sort(first, end, op):对区间[first, end)进行排序,第一形式使用operator<排序,第二形式使用op(elem1, elem2)进行排序(如果是string,首字母按字典顺序进行排列)
• stable_sort:与sort的区别是,能保证相等元素的相对位置不变。前两个参数接收表示范围的迭代器,第三个参数为可调用表达式表示重新排序的条件
注意:以上四个算法需要随即访问迭代器,所以只能用于vector,string,deque和数组,所以不能用于关联容器;list有自己的sort成员函数
2.局部排序:
• partial_sort(first, sort_end, end)/partial_sort(first, sort_end, end, op):第一形式以operator<对[beg, end)区间内的元素进行排序,使[first, sort_end)区间内的元素处于已序状态;第二形式使用二元谓词排序
○ 与sort不同的是partial_sort并不对所有元素排序,一旦[first, sort_end)之间的之间的所有元素都排序好就立马停止;
○ 如果sort_end等于end则对所有序列进行排序
• partial_sort_copy(first, end, destfirst, destend):copy和partion_sort的结合,将元素从源区间[first, end)复制到[destfirst, destend)并进行排序,
○ 被排序和复制的元素是源和目标两者所含元素量的较小值
○ 两者都返回目标区间内最后一个被复制元素的下一个位置
○ 如果源区间小于目标区间,所有元素都会被排序
• partition:接受两个表示序列的迭代器,第三个参数为谓词,使得谓词为true的排在序列前半部分,谓词为false的排在序列的后半部分,算法返回一个迭代器,指向最后一个使谓词为true的元素后面的位置
• 该算法只需要双向迭代器,因此可以在任何标准序列迭代器上使用partition和stable_partition
3.根据第n个元素排序:
• nth_element(first, biu, end)/nth_element(first, biu, end, func):排序后,第biu位置前的元素小于biu位置的元素,第biu位置后的元素大于biu位置的元素
5.partition:接受两个表示序列的迭代器,第三个参数为谓词,使得谓词为true的排在序列前半部分,谓词为false的排在序列的后半部分
算法返回一个迭代器,指向最后一个使谓词为true的元素后面的位置
该算法只需要双向迭代器,因此可以在任何标准序列迭代器上使用partition和stable_partition
6.stable_partition: partition的重载,用法类似stable_sort
7.堆算法:
• 函数:
○ make_heap:将某个区间转换成一个heap
○ push_heap(beg, end)/push_heap(beg, end, op>:将end元素之前的最后一个元素加入原本就是heap的[beg, end-1)区间内,使整个[beg, end)区间成为一个heap;
§ 调用者必须保证进入函数时,[beg, end-1)区间内的元素原本便已经形成一个heap,而新元素紧跟其后
§ 复杂度:对数,至少执行log(numElems次比较
○ pop_heap(beg, end)/pop_heap(beg, end, op):
§ 两种形式从heap[beg, end)内的最高元素移动到最后位置,并将剩余区间[beg, end-1)内的元素组织起来,成为一个新的heap
§ op(elem1, elem2):排序准则,可有可无
§ 调用者必须保证进入函数时[beg, end)区间内的元素原本已经形成一个heap
§ 复杂度:
○ sort_heap:对heap进行排序,完成后就不再是一个heap了
• 可以传递一个函数作为排序准则,默认的排序准则是operator<
• is_heap:检验区间内的元素是否排序成为一个堆
• is_heap_until:返回区间内第一个破坏heap排序状态的元素
五.已排序区间算法:以下算法适用前提是源区间必须在某个排序准则的作用下已经排好序
1.查找元素
• bool binary_search(beg, end, const T& value) / bool binary_search(beg, end, const T& value, op)
○ 调用者必须保证,进入算法之际,工作区间已经排序
○ op(elem1, elem2)
○ 两种形式都判断区间[beg, end)是否包含"和value等值"的元素
2.检查数个元素是否存在
• bool includes(beg, end, searchBeg, searchEnd)/bool includes(beg, end, searchBeg, searchEnd, op)
○ 两种形式都用来判断已排序区间[beg, end)是否包含另一个已排序区间[searchBeg, searchEnd)的全部元素
○ op(elem1, elem2)
○ 调用者必须确保,在进入算法之际两个区间都已经根据同一个准则排好序了
3.查找第一个或最后一个可能位置
• ForwardIterator lower_bound(beg, end, const T& value)/ForwardIterator lower_bound(beg, end, const T& value, op)
• ForwardIterator upper_bound(beg, end, const T& value)/ForwardIterator upper_bound(beg, end, const T& value, op)
○ 返回第一个大于等于value的元素位置,这是可插入元素值为value且不破坏区间[beg, end)已排序性的第一个位置
○ 返回第一个大于value的元素,这是可插入元素值为value且不破坏区间[beg, end)已排序性的最后一个位置
○ 如果不存在值为value的元素,都返回end
○ 若要同时获得lower_bound和upper_bound的结果,使用equal_range()
4.查找第一个和最后一个可能位置
• pair
○ 两种形式都返回与value相等的元素所形成的区间pair(返回区间为[beg, end)),在此区间内插入值为value的元素并不会破坏[beg, end)区间的已排序性
○ 等效于:make_pair(lower_bound(…), upper_bound(…))
5.合并元素
两个已排序集合的总和
• OutputIterator merge(Beg, End, Beg2, End2, destBeg)/OutputIterator merge(Beg, End, Beg2, End2, destBeg, op)
○ 将两个源区间【beg,end)合并,使以destBeg起始之目标区间内含两个源区间的所有元素
○ 目标区间的元素都处于排序状态下
○ 返回目标区间内最后一个被复制元素的下一个位置
○ 源区间不会有任何变化
○ list和forward_list都提供一个特殊的成员函数merge来合并两个list
○ 如果要确保两个源区间中出现的元素在目标区间中只出现一次,使用set_union
○ 如果只想获得同时存在于两个源区间内的元素,使用set_intersection
• 两个已排序集合的并集:OutputIterator set_union(beg1,end1, beg2,end2,destBeg)/OutputIterator set_union(beg1,end1, beg2,end2,destBeg, op)
○ 两者都是将区间[beg1,end1)和[beg2, end2)内的元素合并,得到以destBeg起始的目标区间,后者内含的元素要么来自第一个区间,要么来自第二个区间,或者同时来自两者
○ 同时出现于两个源区间内的元素在并集区间中将只出现一次,但是如果原来的某个源区间内本身就存在重复的元素则目标区间也会存在重复元素
○ 返回最后一个被复制元素的下一位置
○ 目标区间内的元素都处于排序状态
○ 必须要保证目标区间有足够的空间,否则就要使用insert iterator
○ 源区间和目标区间两者不可重叠
• 两个已排序集合的交集:OutputIterator set_intersection(beg1, end1, beg2, end2, destbeg)/set_intersection(beg1, end1, beg2, end2, destbeg, op)
• 两个已排序集合的差集:
○ OutputIterator set_difference(beg1, end1, beg2, beg2, destbeg)/set_difference(beg1, end1, beg2, beg2, destbeg, op)
§ 目标区间的元素只存在于第一区间,不存在于第二区间
§ 返回最后一个被合并元素的下一个位置
○ OutputIterator set_symmetric_difference(beg1, end1, beg2, beg2, destbeg)/OutputIterator set_symmetric_difference(beg1, end1, beg2, beg2, destbeg, op)
§ 目标区间内含的元素或存在于第一源区间,或存在于第二源区间,不同时存在于两个区间内
• 合并连贯之已排序区间:void inplace_merge(beg1, beg2, end2)/inplace_merge(beg1, beg2, end2, op)
○ 将已排序源区间[beg1, beg2), [beg2, end2)合并,使区间[beg1, end2)成为两者之和
数值算法:#include
std::max(const T&a, const T& b):返回较大的数
void generate(ForwardIterator beg, ForwardIterator end, Func op): 调用op产生新值,并将它赋值给区间(beg, end)的所有元素
• 注意是每次给区间中的一个元素赋值时会调用一次op,所以调用的次数和区间中的元素个数相同
• 区间是(beg,end),即第二个和倒数第二个(目前测试是这样,见C++标准库10.1.2)
generator_n(OutputIterator beg, Size num, Func op):调用op产生新值,并将它赋值给以beg起始的区间内的前num个元素,如果num为负值不做任何事,返回最后被该动的元素的下一位置,注意是每次给区间中的一个元素赋值时会调用一次op,所以调用的次数和区间中的元素个数相同
accumulate(InputIterator beg, InputIterator end, T initValue)/accumulate(InputIterator beg, InputIterator end, T initValue, op):结合所有元素(求和,求乘积)
• 第一形式:计算initValue对区间[beg, end)内的每个元素的总和,具体:initValue=initValue+elem