zoukankan      html  css  js  c++  java
  • STL 常用算法

    现代C++程序设计比较推崇使用模板STL。STL是C++中一个非常重要的改革。在C++03之后,STL表现非常不错,STL中提供了一些常见的算法。这些算法可以直接使用,而不需要自己再去写,效率。

    简单总结一下STL一些比较好的算法。

    一. 非变易算法

    1. for_each:遍历容器元素进行操作

    该函数的源代码:

    template<class InputIterator, class Function>

    Function for_each(InputIterator first, InputIterator last, Function f)

    {

    for ( ; first!=last; ++first ) f(*first);

    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;

    }

    二、变易算法

    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容器稳定分割

    也是重新分割排列容器内的元素,但是可以保持原有的顺序。实现的时候使用了临时缓冲区。

    三、排序算法

    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 );

    四、二叉搜索

    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));

    }

    五、归并操作

    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++; }

    }

    }

    六、堆操作

    这儿有一个对堆操作的总结: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 );

    七、最大/最小操作

    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);

    八、数值计算

    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;

    }

  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/miki-52/p/5732518.html
Copyright © 2011-2022 走看看