STL 經常使用算法

現代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;

}

相關文章
相關標籤/搜索