現代C++程序設計比較推崇使用模板STL。STL是C++中一個很是重要的改革。在C++03以後,STL表現很是不錯,STL中提供了一些常見的算法。這些算法能夠直接使用,而不須要本身再去寫,效率。html
簡單總結一下STL一些比較好的算法。算法
一. 非變易算法dom
1. for_each:遍歷容器元素進行操做函數
該函數的源代碼:post
template<class InputIterator, class Function>spa
Function for_each(InputIterator first, InputIterator last, Function f)設計
{orm
for ( ; first!=last; ++first ) f(*first);htm
return f;對象
}
其中f能夠是普通的函數,也能夠是函數對象。
2. find:查找容器的元素
函數源代碼:
template<class InputIterator, class T>
InputIterator find ( InputIterator first, InputIterator last, const T& value )
{
for ( ;first!=last; first++) if ( *first==value ) break;
return first;
}
3. find_if: 條件查找容器的元素
函數源代碼:
template<class InputIterator, class Predicate>
InputIterator find_if ( InputIterator first, InputIterator last,Predicate pred )
{
for ( ; first!=last ; first++ ) if ( pred(*first) ) break;
return first;
}
pred是一個函數對象。
4. adjacent_find:鄰近查找容器元素
函數聲明:
template <class ForwardIterator>
ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last );
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last, BinaryPredicate pred );
函數代碼:
template <class ForwardIterator>
ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last )
{
if (first != last)
{
ForwardIterator next=first; ++next;
while (next != last) {
if (*first == *next) // or: if (pred(*first,*next)), for the pred version
return first;
else { ++first; ++next; }
}
}
return last;
}
5. find_first_of範圍查找容器元素
查找首次出現的元素
函數聲明:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2 );
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate pred );
函數源代碼:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
{
for ( ; first1 != last1; ++first1 )
for (ForwardIterator2 it=first2; it!=last2; ++it)
if (*it==*first1) // or: if (comp(*it,*first)) for the pred version
return first1;
return last1;
}
6. count:統計等於某值的容器元素的個數
函數源代碼:
template <class InputIterator, class T>
ptrdiff_t count ( InputIterator first, InputIterator last, const T& value )
{
ptrdiff_t ret=0;
while (first != last) if (*first++ == value) ++ret;
return ret;
}
7. count_if:條件統計容器元素個數
函數源代碼:
template <class InputIterator, class Predicate>
ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred )
{
ptrdiff_t ret=0;
while (first != last) if (pred(*first++)) ++ret;
return ret;
}
8. mismatch:元素不匹配查找
比較兩個序列,找出首個不匹配的元素的位置。經過配對對象pair返回這兩個元素的迭代器,指示不匹配元素的位置。
函數聲明:
template <class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>
mismatch (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2 );
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2>
mismatch (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred );
函數源代碼:
template <class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>
mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{
while ( (first1!=last1) && (*first1==*first2) ) // or: pred(*first1,*first2), for the pred version
{ ++first1; ++first2; }
return make_pair(first1,first2);
}
9. equal元素相等判斷
相似mismatch,equal也是逐一比較兩個序列的元素是否相等,只是equal函數返回true/false,不返回迭代器值。
函數聲明:
template <class InputIterator1, class InputIterator2>
bool equal ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2 );
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred );
函數源代碼:
template <class InputIterator1, class InputIterator2>
bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{
while ( first1!=last1 )
{
if (!(*first1 == *first2)) // or: if (!pred(*first1,*first2)), for pred version
return false;
++first1; ++first2;
}
return true;
}
10. search:子序列搜索
在一個序列中搜索與另外一個序列匹配的子序列。返回子序列的首個元素的迭代器值,返回last1表示沒有匹配的子序列。
函數聲明:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2 );
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2.
BinaryPredicate pred );
函數源代碼:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
{
if (first2==last2) return first1; // specified in C++11
while (first1!=last1)
{
ForwardIterator1 it1 = first1;
ForwardIterator2 it2 = first2;
while (*it1==*it2) { // or: while (pred(*it1,*it2)) for the pred version
++it1; ++it2;
if (it2==last2) return first1;
if (it1==last1) return last1;
}
++first1;
}
return last1;
}
11. search_n: 重複元素子序列搜索
搜索序列中是否有一系列元素值均爲某個給定值的子序列。返回子序列的首個元素的迭代器,返回last表示沒有重複的子序列。
函數聲明:
template <class ForwardIterator, class Size, class T>
ForwardIterator search_n ( ForwardIterator first, ForwardIterator last,
Size count, const T& value );
template <class ForwardIterator, class Size, class T, class BinaryPredicate>
ForwardIterator search_n ( ForwardIterator first, ForwardIterator last,
Size count, const T& value, BinaryPredicate pred );
函數源代碼:
template<class ForwardIterator, class Size, class T>
ForwardIterator search_n ( ForwardIterator first, ForwardIterator last,
Size count, const T& value )
{
ForwardIterator it, limit;
Size i;
limit=first; advance(limit,distance(first,last)-count);
while (first!=limit)
{
it = first; i=0;
while (*it==value) // or: while (pred(*it,value)) for the pred version
{ ++it; if (++i==count) return first; }
++first;
}
return last;
}
12. find_end:最後一個子序列搜索
在一個序列中搜索出最後一個與另外一個序列匹配的子序列。返回值爲首元素的迭代器或返回last1,表示沒有子序列匹配。
函數聲明:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2 );
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate pred );
函數源代碼:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2)
{
if (first2==last2) return last1; // specified in C++11
ForwardIterator1 ret = last1;
while (first1!=last1)
{
ForwardIterator1 it1 = first1;
ForwardIterator2 it2 = first2;
while (*it1==*it2) { // or: while (pred(*it1,*it2)) for the pred version
++it1; ++it2;
if (it2==last2) { ret=first1; break; }
if (it1==last1) return ret;
}
++first1;
}
return ret;
}
2、變易算法
1. copy元素複製
用於容器間元素的匹配。
函數源代碼:
template<class InputIterator, class OutputIterator>
OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
{
while (first!=last) *result++ = *first++;
return result;
}
2. copy_backward反向複製
函數源代碼:
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result )
{
while (last!=first) *(--result) = *(--last);
return result;
}
3. swap元素交換
這個操做很是的常見。
函數源代碼:
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
4. iter_swap迭代器交換
這是swap算法的迭代器形式。
函數源代碼:
template <class ForwardIterator1, class ForwardIterator2>
void iter_swap ( ForwardIterator1 a, ForwardIterator2 b )
{
swap (*a, *b);
}
5. swap_ranges區間元素交換
用於兩個迭代器區間元素的交換。
函數源代碼:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2 )
{
while (first1!=last1) swap(*first1++, *first2++);
return first2;
}
6. transform元素變換
用於實現容器元素的變換操做。
函數聲明:
template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op );
template < class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperator >
OutputIterator transform ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperator binary_op );
函數源代碼:
template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op )
{
while (first1 != last1)
*result++ = op(*first1++); // or: *result++=binary_op(*first1++,*first2++);
return result;
}
7. replace替換
將區間上的指定元素替換爲新值。
函數源代碼:
template < class ForwardIterator, class T >
void replace ( ForwardIterator first, ForwardIterator last,
const T& old_value, const T& new_value )
{
for (; first != last; ++first)
if (*first == old_value) *first=new_value;
}
8. replace_if條件替換
函數源代碼:
template < class ForwardIterator, class Predicate, class T >
void replace_if ( ForwardIterator first, ForwardIterator last,
Predicate pred, const T& new_value )
{
for (; first != last; ++first)
if (pred(*first)) *first=new_value;
}
9. replace_copy替換和複製
先進行元素替換,再將元素複製到新容器。
函數源代碼:
template < class InputIterator, class OutputIterator, class T >
OutputIterator replace_copy ( InputIterator first, InputIterator last,
OutputIterator result, const T& old_value, const T& new_value )
{
for (; first != last; ++first, ++result)
*result = (*first==old_value)? new_value: *first;
return result;
}
10. replace_copy_if條件替換和複製
函數源代碼:
template < class InputIterator, class OutputIterator, class Predicate, class T >
OutputIterator replace_copy_if ( InputIterator first, InputIterator last,
OutputIterator result, Predicate pred,
const T& new_value )
{
for (; first != last; ++first, ++result)
*result = (pred(*first))? new_value: *first;
return result;
}
11. fill填充
將同一個值填充到容器的一個或多個元素處。
函數源代碼:
template < class ForwardIterator, class T >
void fill ( ForwardIterator first, ForwardIterator last, const T& value )
{
while (first != last) *first++ = value;
}
12. fill_n n次填充
函數源代碼:
template < class OutputIterator, class Size, class T >
void fill_n ( OutputIterator first, Size n, const T& value )
{
for (; n>0; --n) *first++ = value;
}
13. generate隨機生成元素
爲容器生成新元素。
函數源代碼:
template <class ForwardIterator, class Generator>
void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
{
while (first != last) *first++ = gen();
}
這兒的gen是一個函數對象,能夠根據本身的須要進行設計。能夠利用rand函數來產生隨機數。爲容器添加隨機數。
14. generate_n隨機生成n個元素
函數源代碼:
template <class OutputIterator, class Size, class Generator>
void generate_n ( OutputIterator first, Size n, Generator gen )
{
for (; n>0; --n) *first++ = gen();
}
15. remove移除
將容器中等於某個給定值的元素所有移除掉。
函數源代碼:
template < class ForwardIterator, class T >
ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value )
{
ForwardIterator result = first;
for ( ; first != last; ++first)
if (!(*first == value)) *result++ = *first;
return result;
}
16. remove_if條件移除
函數源代碼:
template < class ForwardIterator, class Predicate >
ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,
Predicate pred )
{
ForwardIterator result = first;
for ( ; first != last; ++first)
if (!pred(*first)) *result++ = *first;
return result;
}
17. remove_copy移除複製
實質上是一個條件複製,將原容器中不等於某個給定值的元素複製到新容器。
函數源代碼:
template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy ( InputIterator first, InputIterator last,
OutputIterator result, const T& value )
{
for ( ; first != last; ++first)
if (!(*first == value)) *result++ = *first;
return result;
}
18. remove_copy_if條件移除複製
函數源代碼:
template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator remove_copy_if ( InputIterator first, InputIterator last,
OutputIterator result, Predicate pred )
{
for ( ; first != last; ++first)
if (!pred(*first)) *result++ = *first;
return result;
}
19. unique剔除連續重複元素
函數原型:
template <class ForwardIterator>
ForwardIterator unique ( ForwardIterator first, ForwardIterator last );
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique ( ForwardIterator first, ForwardIterator last,
BinaryPredicate pred );
函數源代碼:
template <class ForwardIterator>
ForwardIterator unique ( ForwardIterator first, ForwardIterator last )
{
ForwardIterator result=first;
while (++first != last)
{
if (!(*result == *first)) // or: if (!pred(*result,*first)) for the pred version
*(++result)=*first;
}
return ++result;
}
20. unique_copy不連續重複元素複製
函數原型:
template <class InputIterator, class OutputIterator>
OutputIterator unique_copy ( InputIterator first, InputIterator last,
OutputIterator result );
template <class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator unique_copy ( InputIterator first, InputIterator last,
OutputIterator result, BinaryPredicate pred );
函數源代碼:
template <class InputIterator, class OutputIterator>
OutputIterator unique_copy ( InputIterator first, InputIterator last,
OutputIterator result )
{
typename std::iterator_traits<InputIterator>::value_type value = *first;
*result=*first;
while (++first != last)
{
if (!(value == *first)) // or: if (!pred(value,*first)) for the pred version
*(++result) = value = *first;
}
return ++result;
}
21. reverse元素反向
函數源代碼:
template <class BidirectionalIterator>
void reverse ( BidirectionalIterator first, BidirectionalIterator last)
{
while ((first!=last)&&(first!=--last))
swap (*first++,*last);
}
22. reverse_copy反向複製
函數源代碼:
template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy ( BidirectionalIterator first,
BidirectionalIterator last, OutputIterator result )
{
while (first!=last) *result++ = *--last;
return result;
}
23. rotate旋轉
函數源代碼:
template <class ForwardIterator>
void rotate ( ForwardIterator first, ForwardIterator middle,
ForwardIterator last )
{
ForwardIterator next = middle;
while (first!=next)
{
swap (*first++,*next++);
if (next==last) next=middle;
else if (first == middle) middle=next;
}
}
24. rotate_copy旋轉複製
經過複製的方法實現旋轉,比rotate算法更加簡單和高效,但須要佔用更多的內存空間。
函數代碼:
template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy ( ForwardIterator first, ForwardIterator middle,
ForwardIterator last, OutputIterator result )
{
result=copy (middle,last,result);
return copy (first,middle,result);
}
25. random_shuffle隨機抖動
對容器內的元素進行隨機排列
函數原型:
function template
random_shuffle
<algorithm>
template <class RandomAccessIterator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& rand );
函數源代碼:
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& rand )
{
iterator_traits<RandomAccessIterator>::difference_type i, n;
n = (last-first);
for (i=n-1; i>0; --i) swap (first[i],first[rand(i+1)]);
}
26. random_sample隨機採樣
對區間元素進行隨機採樣。這個函數不在STL中,是SGI STL中添加的。
函數源代碼:
template <class InputIter, class RandomAccessIter,
class RandomNumberGenerator, class Distance>
RandomAccessIter random_sample(InputIter first, InputIter last,
RandomAccessIter out, RandomNumberGenerator& rand, const Distance n){
Distance m=0;
Distance t=n;
for(;first!=last&&m<n;++m,++first)
out[m]=*first;
while(first!=last){
++t;
Distance M=rand(t);
if(M<n)
out[M]=*first;
++first;
}
return out+m;
}
template <class InputIter, class RandomAccessIter, class RandomNumberGenerator>
inline RandomAccessIter random_sample(InputIter first, InputIter last, RandomAccessIter out_first,
RandomAccessIter out_last, RandomNumberGenerator& rand){
return random_sample(first,last,out_first,rand,out_last-out_first);
}
27. partition容器分割
用於從新分割排列容器的元素。返回值爲最後的分界元素。
函數源代碼:
template <class BidirectionalIterator, class Predicate>
BidirectionalIterator partition ( BidirectionalIterator first,
BidirectionalIterator last, Predicate pred )
{
while (true)
{
while (first!=last && pred(*first)) ++first;
if (first==last--) break;
while (first!=last && !pred(*last)) --last;
if (first==last) break;
swap (*first++,*last);
}
return first;
}
28. stable_partition容器穩定分割
也是從新分割排列容器內的元素,可是能夠保持原有的順序。實現的時候使用了臨時緩衝區。
3、排序算法
1. sort排序
最壞狀況下也爲O(nlogn),較對排序稍快些。
函數原型:
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
2. stable_sort穩定排序
函數原型:
template <class RandomAccessIterator>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
3.partial_sort 局部排序
僅對部分元素進行排序,一般挑選最小(或最大)的若干元素。內部使用堆排序實現,複雜度爲O(nlogn).
函數原型:
template <class RandomAccessIterator>
void partial_sort ( RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void partial_sort ( RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last, Compare comp );
4. partial_sort_copy 局部排序複製
本質上是進行局部的堆排序,只是排序結果被放置到另外一個區間範圍中去。
函數原型:
template <class InputIterator, class RandomAccessIterator>
RandomAccessIterator
partial_sort_copy ( InputIterator first,InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last );
template <class InputIterator, class RandomAccessIterator, class Compare>
RandomAccessIterator
partial_sort_copy ( InputIterator first,InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last, Compare comp );
5.nth_element 第n個元素
算法僅排序第n個元素
函數原型:
template <class RandomAccessIterator>
void nth_element ( RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void nth_element ( RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last, Compare comp );
4、二叉搜索
1. lower_bound 下确界
用於在有序區間中查找首個不小於某值的元素。採用的是折半查找的方式.
函數原型:
template <class ForwardIterator, class T>
ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last,
const T& value );
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
函數源代碼:
template <class ForwardIterator, class T>
ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last, const T& value )
{
ForwardIterator it;
iterator_traits<ForwardIterator>::difference_type count, step;
count = distance(first,last);
while (count>0)
{
it = first; step=count/2; advance (it,step);
if (*it<value) // or: if (comp(*it,value)), for the comp version
{ first=++it; count-=step+1; }
else count=step;
}
return first;
}
2. upper_bound上確界
用於在有序區間中查找首個不大於某值的元素。採用的是折半查找的方式.
函數原型:
template <class ForwardIterator, class T>
ForwardIterator upper_bound ( ForwardIterator first, ForwardIterator last,
const T& value );
template <class ForwardIterator, class T, class Compare>
ForwardIterator upper_bound ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
函數源代碼:
template <class ForwardIterator, class T>
ForwardIterator upper_bound ( ForwardIterator first, ForwardIterator last, const T& value )
{
ForwardIterator it;
iterator_traits<ForwardIterator>::difference_type count, step;
count = distance(first,last);
while (count>0)
{
it = first; step=count/2; advance (it,step);
if (!(value<*it)) // or: if (!comp(value,*it)), for the comp version
{ first=++it; count-=step+1; }
else count=step;
}
return first;
}
3. equal_range 等價區間
函數原型:
template <class ForwardIterator, class T>
pair<ForwardIterator,ForwardIterator>
equal_range ( ForwardIterator first, ForwardIterator last, const T& value );
template <class ForwardIterator, class T, class Compare>
pair<ForwardIterator,ForwardIterator>
equal_range ( ForwardIterator first, ForwardIterator last, const T& value,
Compare comp );
函數源代碼:
template <class ForwardIterator, class T>
pair<ForwardIterator,ForwardIterator>
equal_range ( ForwardIterator first, ForwardIterator last, const T& value )
{
ForwardIterator it = lower_bound (first,last,value);
return make_pair ( it, upper_bound(it,last,value) );
}
4. binary_search
函數原型:
template <class ForwardIterator, class T>
bool binary_search ( ForwardIterator first, ForwardIterator last,
const T& value );
template <class ForwardIterator, class T, class Compare>
bool binary_search ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
函數源代碼:
template <class ForwardIterator, class T>
bool binary_search ( ForwardIterator first, ForwardIterator last, const T& value )
{
first = lower_bound(first,last,value);
return (first!=last && !(value<*first));
}
5、歸併操做
1. merge 歸併
函數原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result );
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (true) {
*result++ = (*first2<*first1)? *first2++ : *first1++;
if (first1==last1) return copy(first2,last2,result);
if (first2==last2) return copy(first1,last1,result);
}
}
2. inplace_merge 內部歸併/原地歸併
將一個序列內部兩個升降同向的子序列進行排序合併。
該算法儘量使用臨時緩衝區進行歸併排序,即便在臨時緩衝區不可用的情形,算法的複雜度也爲O(nlogn)
函數原型:
template <class BidirectionalIterator>
void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
BidirectionalIterator last );
template <class BidirectionalIterator, class Compare>
void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
BidirectionalIterator last, Compare comp );
3. includes 子集合
檢測一個有序區間是否包含另外一個有序區間,至關於一個集合包含關係判斷。
函數原型:
template <class InputIterator1, class InputIterator2>
bool includes ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 );
template <class InputIterator1, class InputIterator2, class Compare>
bool includes ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2>
bool includes ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 )
{
while (first1!=last1)
{
if (*first2<*first1) break;
else if (*first1<*first2) ++first1;
else { ++first1; ++first2; }
if (first2==last2) return true;
}
return false;
}
4. set_union 集合求並
函數原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result );
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (true)
{
if (first1==last1) return copy(first2,last2,result);
if (first2==last2) return copy(first1,last1,result);
if (*first1<*first2) *result++ = *first1++;
else if (*first2<*first1) *result++ = *first2++;
else { *result++ = *first1++; first2++; }
}
}
5. set_intersection 集合求交
函數原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result );
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (first1!=last1 && first2!=last2)
{
if (*first1<*first2) ++first1;
else if (*first2<*first1) ++first2;
else { *result++ = *first1++; first2++; }
}
return result;
}
6. set_difference 集合求差
函數原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result );
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (first1!=last1 && first2!=last2)
{
if (*first1<*first2) *result++ = *first1++;
else if (*first2<*first1) first2++;
else { first1++; first2++; }
}
return copy(first1,last1,result);
}
7. set_symmetric_difference 集合求異
函數原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator
set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result );
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator
set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (true)
{
if (first1==last1) return copy(first2,last2,result);
if (first2==last2) return copy(first1,last1,result);
if (*first1<*first2) { *result++ = *first1++; }
else if (*first2<*first1) { *result++ = *first2++; }
else { first1++; first2++; }
}
}
6、堆操做
這兒有一個對堆操做的總結:http://www.cnblogs.com/xkfz007/archive/2012/08/25/2655620.html
1. push_heap 元素入堆
函數原型:
template <class RandomAccessIterator>
void push_heap ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void push_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
2. pop_heap 元素出堆
函數原型:
template <class RandomAccessIterator>
void pop_heap ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void pop_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
3. make_heap 建立堆
函數原型:
template <class RandomAccessIterator>
void make_heap ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void make_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
4. sort_heap 堆排序
函數原型:
template <class RandomAccessIterator>
void sort_heap ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void sort_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
7、最大/最小操做
1. min
函數原型:
template <class T> const T& min ( const T& a, const T& b );
template <class T, class Compare>
const T& min ( const T& a, const T& b, Compare comp );
函數源代碼:
template <class T> const T& min ( const T& a, const T& b ) {
return !(b<a)?a:b; // or: return !comp(b,a)?a:b; for the comp version
}
2. max
函數原型:
template <class T> const T& max ( const T& a, const T& b );
template <class T, class Compare>
const T& max ( const T& a, const T& b, Compare comp );
函數源代碼:
template <class T> const T& max ( const T& a, const T& b ) {
return (a<b)?b:a; // or: return comp(a,b)?b:a; for the comp version
}
3. min_element 最小元素
函數原型:
template <class ForwardIterator>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last );
template <class ForwardIterator, class Compare>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last,
Compare comp );
函數源代碼:
template <class ForwardIterator>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last )
{
ForwardIterator lowest = first;
if (first==last) return last;
while (++first!=last)
if (*first<*lowest) // or: if (comp(*first,*lowest)) for the comp version
lowest=first;
return lowest;
}
4. max_element 最大元素
函數原型:
template <class ForwardIterator>
ForwardIterator max_element ( ForwardIterator first, ForwardIterator last );
template <class ForwardIterator, class Compare>
ForwardIterator max_element ( ForwardIterator first, ForwardIterator last,
Compare comp );
函數源代碼:
template <class ForwardIterator>
ForwardIterator max_element ( ForwardIterator first, ForwardIterator last )
{
ForwardIterator largest = first;
if (first==last) return last;
while (++first!=last)
if (*largest<*first) // or: if (comp(*largest,*first)) for the comp version
largest=first;
return largest;
}
5. lexicographical_compare 字典比較
函數原型:
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 );
template <class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp );
函數源代碼:
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 )
{
while (first1!=last1)
{
if (first2==last2 || *first2<*first1) return false;
else if (*first1<*first2) return true;
first1++; first2++;
}
return (first2!=last2);
}
6. next_permutation 下一排列組合
對區間元素進行一次排列,使之字典順序大於原來的排列
函數原型:
template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first,
BidirectionalIterator last );
template <class BidirectionalIterator, class Compare>
bool next_permutation (BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
7. prev_permutation 上一排列組合
對區間元素進行一次排列,使之字典順序小於原來的排列
函數原型:
template <class BidirectionalIterator>
bool prev_permutation (BidirectionalIterator first,
BidirectionalIterator last );
template <class BidirectionalIterator, class Compare>
bool prev_permutation (BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
8、數值計算
1. accumulate 元素求和
將區間元素進行累計求和
函數原型:
template <class InputIterator, class T>
T accumulate ( InputIterator first, InputIterator last, T init );
template <class InputIterator, class T, class BinaryOperation>
T accumulate ( InputIterator first, InputIterator last, T init,
BinaryOperation binary_op );
函數源代碼:
template <class InputIterator, class T>
T accumulate ( InputIterator first, InputIterator last, T init )
{
while ( first!=last )
init = init + *first++; // or: init=binary_op(init,*first++) for the binary_op version
return init;
}
2. adjacent_difference 相鄰元素求差
函數原型:
template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference ( InputIterator first, InputIterator last,
OutputIterator result );
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator adjacent_difference ( InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op );
函數源代碼:
template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference ( InputIterator first, InputIterator last,
OutputIterator result )
{
iterator_traits<InputIterator>::value_type val,prev;
*result++ = prev = *first++;
while (first!=last) {
val = *first++;
*result++ = val - prev; // or: *result++ = binary_op(val,prev) for binary_op version
prev = val;
}
return result;
}
3. inner_product 兩序列元素內積
函數原型:
template <class InputIterator1, class InputIterator2, class T>
T inner_product ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init );
template <class InputIterator1, class InputIterator2, class T,
class BinaryOperation1, class BinaryOperation2>
T inner_product ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init,
BinaryOperation1 binary_op1,
BinaryOperation2 binary_op2 );
函數源代碼:
template <class InputIterator1, class InputIterator2, class T>
T inner_product ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init )
{
while (first1!=last1)
init = init + (*first1++)*(*first2++);
// or: init=binary_op1(init,binary_op2(*first1++,*first2++))
// for the binary_op's version
return init;
}
4. partial_sum 部分元素求和
函數原型:
template <class InputIterator, class OutputIterator>
OutputIterator partial_sum ( InputIterator first, InputIterator last,
OutputIterator result );
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum ( InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op );
函數源代碼:
template <class InputIterator, class OutputIterator>
OutputIterator partial_sum ( InputIterator first, InputIterator last,
OutputIterator result )
{
iterator_traits<InputIterator>::value_type val;
*result++ = val = *first++;
while (first!=last)
*result++ = val = val + *first++;
// or: *result++ = val = binary_op(val,*first++) for binary_op version
return result;
}