深入详解STL算法

C++ STL常用算法详解 作为C++程序员,STL算法是我们必须掌握的基本功。STL(Standard Template Library)是C++标准库的一部分,提供了许多常用的数据结构和算法,方便我们进行快速开发。本文将对STL算法进行详细讲解,包括常用算法的介绍、实现和示例代码。本文所涉及的算法包括查找算法、排序算法、变序列算法、数值算法和集合算法等,可以帮助读者更全面地了解STL算法的使用方法。以上便是本文对STL算法的详细介绍和实现。希望读者可以通过本文更加深入地理解和掌握STL算法,从而能够在实际开发中发挥更大的作用。 阅读详情

                    深入详解STL算法

    下面将介绍标准模板库定义的算法。这些算法通过迭代器在容器中进行操作。所有的算法都是模板函数。

算法详细说明:

    adjacent_find

    template<class _FwdIt> inline

        _FwdIt adjacent_find(_FwdIt _First, _FwdIt _Last);

    template<class _FwdIt, class _Pr> inline

        _FwdIt adjacent_find(_FwdIt _First, _FwdIt _Last, _Pr _Pred);

adjacent_find算法从start到end的序列中搜索临近的匹配的元素,并返回第一个元素的迭代器。如果没有找到任何邻近对,将返回_last。上面第一种形式搜索等价元素。第二个形式允许指定自己的方法来确定元素是否匹配。

    binary_search

    template<class _FwdIt, class _Ty> inline

        bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty% _Val);

    template<class _FwdIt, class _Ty, class _Pr> inline

        bool binary_search(_FwdIt _First, _FwdIt _Last,const _Ty% _Val, _Pr _Pred);

该算法对已经排好序的序列从_fist到_last范围内执行二分搜索,搜索值_val。如果找到了_val将返回true,否则,返回false。第一种形式比较指定序列中的元亲是否相等。第二钟形式可指定自己的比较函数。

    copy

    template<class _InIt, class _OutIt> inline

       _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest);

copy()算法复制从_first开始到_last结束的序列.并将结果放入_DestBeg所指向的序列中,它返回指向结果序列结尾的指针,要复制的范围一定不能与_DestBeg重叠。返回迭代器为_DestEnd+(_Last-_First)。

    count

    template<class _InIt, class _Ty> inline

       typename iterator_traits<_InIt>::difference_type

          count(_InIt _First, _InIt _Last, const _Ty% _Val);

返回序列中从_First处开始到_Last处结束范围内与_Val匹配的元素的个数。

    count_if  

    template<class _InIt, class _Pr> inline

       typename iterator_traits<_InIt>::difference_type

           count_if(_InIt _First, _InIt _Last, _Pr _Pred);

返回序列中从start处开始到end处结束范围内使一元谓词_Pred返回true的元素个数。

    equal      

    template<class _InIt1, class _InIt2> inline

      bool equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2);

    template<class _InIt1, class _InIt2, class _Pr> inline

      bool equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Pr _Pred);

equal确定两个范围足否相同。算法将把_First1和_Last1所决定的范围与_First2所指向的序列进行比较。如果两者相同,将返回true。否则,将返回false。第二种形式允许指定二元谓词来确定两个元素是否相等。

    equal_range

    template<class _FwdIt, class _Ty> inline

      _PAIR_TYPE(_FwdIt) equal_range(_FwdIt _First, _FwdIt _Last, const _Ty% _Val);

    template<class _FwdIt, class _Ty, class _Pr> inline

       _PAIR_TYPE(_FwdIt) equal_range(_FwdIt _First, _FwdIt _Last,const _Ty% _Val, _Pr _Pred);

该算法返回一个范围,在其中可插入元素到序列中而不会破坏排序顺序。_First和_Last指定了搜索范围,搜索值以_Val传递进来。要指定自己的搜索条件,可以自己指定比较函数_Comp。模板类pair为应用类,能够在其first和second成员中保存一对对象。

    fill

    template<class _FwdIt, class _Ty> inline

      void fill(_FwdIt _First, _FwdIt _Last, const _Ty% _Val);

    fill_n

    template<class _OutIt, class _Diff, class _Ty> inline

       void fill_n(_OutIt _First, _Diff _Count, const _Ty% _Val);

fill()和fill_n()算法使用val指定的值填充一个范围。对于fill(),范围是通过start

和end指定的,而对于fill_n(),范围从_First开始,包含_Count个元素。

    find

    template<class _InIt, class _Ty> inline

       _InIt find(_InIt _First, _InIt _Last, const _Ty% _Val);

find()算法从 _First到_Last的范围中搜索_Val值。它返回指向所找到的第一个元素的迭代器。如果没有找到这样的元素.将返问指向_Last的迭代器。

    find_end

      template<class _FwdIt1, class _FwdIt2> inline

       _FwdIt1 find_end(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2);

     template<class _FwdIt1, class _FwdIt2, class _Pr> inline

       _FwdIt1 find_end(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred);

   该算法从[_First1, _Last1)范围内查找出[_First2, _Last2)定义的子序列。如果找到这样的序列,函数将返回指向范围中最后一个子序列中第一个一个元素的迭代器。否则,返回迭代器_Last1。第二种形式可指定确定元素何时匹配的二元谓词。

    find_first_of

    template<class _FwdIt1, class _FwdIt2> inline

      _FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2);

    template<class _FwdIt1, class _FwdIt2, class _Pr> inline

      _FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred);

    find_if

    template<class _InIt, class _Pr> inline

       _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred);

从[_First,_Last)的范围中搜索使一元谓词_Pred返回true的元素。它返回指向满足条件的第—个元素的选代器。如果序列中没有这样的值,算法将返回指向_Last的这代器。

    for_each

    template<class _InIt, class _Fn1> inline

       _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func);

for_each 算法将范围 [first, last) 中的每个元素中调用函数 _Func,并返回输入的参数。

    generate

    template<class _FwdIt, class _Fn0> inline

       void generate(_FwdIt _First, _FwdIt _Last, _Fn0 _Func);

    generate_n

    template<class _OutIt, class _Diff, class _Fn0> inline

      void generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func);

算法generate和generate_n为一个范围中的元素分配由生成器函数返回的值。对于generate(),范围_First和_Lastd指定的。对于generate_n(),范围_First处开始,并包含了num个元素。生成器函数是通过_Gen传递进来的,它没有任何参数。

    includes

    template<class _InIt1, class _InIt2> inline

      bool includes(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2);

    template<class _InIt1, class _InIt2, class _Pr> inline

      bool includes(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _Pr _Pred);

includes用来确定由_First1和_Last1定义的已排好序的序列是否包括由_First2和_Last2所定义的已排好序的序列中的所有元素。如果都包括,它返回true,否则算法返回false。在第二种形式中,可指定确定两个元素大小关系的比较函数。

   iter_swap 

   template<class _FwdIt1, class _FwdIt2> inline

      void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right);

将它的两个迭代器参数指向的值进行交换。

lexicographical_compare

template<class _InIt1, class _InIt2> inline

    bool lexicographical_compare(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2);

template<class _InIt1, class _InIt2, class _Pr> inline

    bool lexicographical_compare(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _Pr _Pred);

按字母表顺序将_First1和_Last1定义的序列_First2和_Last22所定义的序列进行比较。如果第—个序列按字典顺厅来说小丁第二个(换句话说.如果按字典顺序第一个序列在第二个之前).则返回true。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    lower_bound   

    template<class _FwdIt, class _Ty> inline

       _FwdIt lower_bound(_FwdIt _First, _FwdIt _Last, const _Ty% _Val);

    template<class _FwdIt, class _Ty, class _Pr> inline

       _FwdIt lower_bound(_FwdIt _First, _FwdIt _Last,const _Ty% _Val, _Pr _Pred);

该算法在start和end定义的序列中查找值<=val的第一个元素。它返回指向此点的迭代器。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    max    

    template<class _Ty> inline

      const _Ty max(const _Ty% _Left, const _Ty% _Right);

    template<class _Ty, class _Pr> inline

      const _Ty max(const _Ty% _Left, const _Ty% _Right, _Pr _Pred);

返回两个数中最大的一个值 。在第二种形式中,可指定确定两个元素大小关系的比较函数。

   max_element

   template<class _FwdIt> inline

      _FwdIt max_element(_FwdIt _First, _FwdIt _Last);

   template<class _FwdIt, class _Pr> inline

      _FwdIt max_element(_FwdIt _First, _FwdIt _Last, _Pr _Pred);

返回指向从start到end的范围中最大元素的选代器。在第二种形式中,可指定确定两个元素大小关系的比较函数。

   merge

   template<class _InIt1, class _InIt2, class _OutIt> inline

     _OutIt merge(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest);

   template<class _InIt1, class _InIt2, class _OutIt, class _Pr> inline

      _OutIt merge(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred);

merge算法将两个已排序的序列合并起来,并将结果放入第三个序列中。要合并的序列是通过_First1、_Last1和_First2、_Last2定义的,结果放入_Result指向的序列。算法返回指向结果序列结尾的迭代器。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    next_permutation

    template<class _BidIt> inline

      bool next_permutation(_BidIt _First, _BidIt _Last);

    template<class _BidIt, class _Pr> inline

      bool next_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred);

该算法构造一个序列的下一个排列。在生成此排列时,假定从低到高有序的序列代表第一个排列。如果下一个排列不存在,该函数将对序列进行排序,使其变为相应的第一个排列,并返回false。否则,算法返回true。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    nth_element

    template<class _RanIt> inline

       void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last);

    template<class _RanIt, class _Pr> inline

      void nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr _Pred);

该算法对从_First到_Last的序列进行排列,使所有小于_Nth的元索都位于_Nth之前,所有大于_Nth的元素都位丁_Nth之后。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    partial_sort

    template<class _RanIt> inline

      void partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last);

    template<class _RanIt, class _Pr> inline

      void partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last,_Pr _Pred);

该算法对_First和_Last定义的序列进行排列,但是,在执行此算法之后,只有从First到_SortEnd范围内的元素是有序的。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    partial_sort_copy

    template<class _InIt, class _RanIt> inline

      _RanIt partial_sort_copy(_InIt _First1, _InIt _Last1,_RanIt _First2, _RanIt _Last2);

    template<class _InIt, class _RanIt, class _Pr> inline

      _RanIt partial_sort_copy(_InIt _First1, _InIt _Last1,_RanIt _First2, _RanIt _Last2, _Pr _Pred);

该算法对_First1到_Last1的范围进行排序,并复制尽量多的元素到_First2和_Last2定义的结果序列中,它返回指向复制到结果序列中最后—个元素的迭代器。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    partion

    template<class _BidIt, class _Pr> inline

      _BidIt partition(_BidIt _First, _BidIt _Last, _Pr _Pred);

partion()算法对_First和_Last定义的序列进行排列,这样,所有使_Comph所指定谓词返回true的元素均位于所有使此谓词返回false的元素之前。它返回指向第一个使指定谓词为false的元素的迭代器。

    prev_permutation

    template<class _BidIt> inline

       bool prev_permutation(_BidIt _First, _BidIt _Last);

    template<class _BidIt, class _Pr> inline

       bool prev_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred);

该算法构造一个序列的上一个排列。在生成此排列时,假定从低到高有序的序列代表第一个排列。如果上一个排列不存在,该函数将对序列进行排序,使其变为最后一个排列,并返回false。否则,算法返回true。在第二种形式中,可指定确定两个元素大小关系的比较函数。

    random_shuffle

    template<class _RanIt> inline

      void random_shuffle(_RanIt _First, _RanIt _Last);

    template<class _RanIt, class _Fn1> inline

      void random_shuffle(_RanIt _First, _RanIt _Last, _Fn1% _Func);

示例:

#include <ctime>

int   myrand(int   n)  

  {  

      srand((int)time(0));

          return   rand()   %   n;          

  }  

int main( ) {

   using namespace std;

   vector <int> v1;

   vector <int>::iterator Iter1, Iter2;

 

   int i;

   for ( i = 1 ; i <= 9 ; i++ )

      v1.push_back( i );

 

   random_shuffle( v1.begin( ), v1.end( ));

   cout << "The original version of vector v1 is: ( " ;

   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )

      cout << *Iter1 << " ";

   cout << ")." << endl;

 

   // Shuffled once

   random_shuffle( v1.begin( ), v1.end( ),myrand);

 

   cout << "Vector v1 after one shuffle is:       ( " ;

   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )

      cout << *Iter1 << " ";

   cout << ")." << endl;

}

输出结果:

The original version of vector v1 is: ( 9 2 7 3 1 6 8 4 5 ).

Vector v1 after one shuffle is:       ( 1 9 6 7 2 5 4 8 3 ).

    remove

    template<class _FwdIt, class _Ty> inline

      _FwdIt remove(_FwdIt _First, _FwdIt _Last, const _Ty% _Val);

    remove_if

    template<class _FwdIt, class _Pr> inline

       _FwdIt remove_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred);

    remove_copy

    template<class _InIt, class _OutIt, class _Ty> inline

      _OutIt remove_copy(_InIt _First, _InIt _Last,_OutIt _Dest, const _Ty% _Val);

    remove_copy_if

    template<class _InIt, class _OutIt, class _Pr> inline

      _OutIt remove_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,_Pr _Pred);

1.remove()从指定范围中删除值等于val的元素,它返回指向剩余元素结尾的迭代器。

2.remove_if从指定范围中删除使谓词_Pred返回true的元素,它返回指向剩余元素结尾的迭代器。

3.remove_copy从指定范围中复制值等丁val的元素,并将结果放入result所指向的序列中:它返回指向结果序列结尾的迭代器。

4.remove_copy_if从指定范围中复制使谓词_Pred返回true的元素,并将结果放入result所指向的序列中:它返回指向结果序列结尾的迭代器。

    replace

    template<class ForwardIterator, class Type>

    template<class _FwdIt, class _Ty> inline

    void replace(_FwdIt _First, _FwdIt _Last,const _Ty% _Oldval, const _Ty% _Newval);

    replace_if

    template<class _FwdIt, class _Pr, class _Ty> inline

     void replace_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred,const _Ty% _Val);

    replace_copy

    template<class _InIt, class _OutIt, class _Ty> inline

      _OutIt replace_copy(_InIt _First, _InIt _Last, _OutIt _Dest, const _Ty% _Oldval, const _Ty% _Newval);

    replace_copy_if

    template<class _InIt, class _OutIt, class _Pr, class _Ty> inline

      _OutIt replace_copy_if(_InIt _First, _InIt _Last, _OutIt _Dest,_Pr _Pred, const _Ty% _Val);

1.在指定的范围中,replace使用值为new的元素替换值为old的元素。

2.在指定的范围中,replace_if使用值为new的元素替换使谓词_Pred返回true的元素。

3.在指定的范围中,replace_copy复制元素到_Result中。在此过程中,它使用值为new的元素替换值为01d的元素。原始范围保持不变。算法返回指向_Result结尾的迭代器。

4.在指定的范围中,replace_copy_if复制元素到_Result中。在此过程中,它使用值为new的元素替换使谓词_Pred返回true的元素。原始范围保持不变。算法返回指向_Result结尾的迭代器。

    reverse

    template<class _BidIt> inline

      void reverse(_BidIt _First, _BidIt _Last);

    reverse_copy

    template<class _BidIt, class _OutIt> inline

       _OutIt reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest);

1.reverse()算法反转由_First和_Last所指定范围的顺序。

2.reverse_copy()算法以逆序复制_First和_Last所指定的范围,并将结果放入_Result中。它返回指_Result结尾的迭代器。

    rotate

    template<class _FwdIt> inline

      void rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last);

    rotate_copy

    template<class _FwdIt, class _OutIt> inline

      _OutIt rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last,_OutIt _Dest);

1.rotate()将_First和_Last所指定范围中的元素向左旋转,使mid指定的元素成为新的首元素。

2.rotate_copy()复制_First和_Last所指定的范围,并将结果存储到_Result中,在此过程中,它会将元素向左旋转,使得mid指定的元素成为新的首元素。它返回指向_Result结尾的迭代器。

    search

    template<class _FwdIt1, class _FwdIt2> inline

      _FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2);

    template<class _FwdIt1, class _FwdIt2, class _Pr> inline

      _FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred);

search()搜索序列的子序列。被搜索的序列由_First1和_Last1定义,而要搜索的子序列则由_First2和_Last2指定。如果找到了这样的子序列,将返指向其开头的迭代器。否则,返回_Last1。在第二种形式中,可指定确定两个元素何时相等的二元谓词。

    search_n

    template<class _FwdIt1, class _Diff2, class _Ty> inline

      _FwdIt1 search_n(_FwdIt1 _First1, _FwdIt1 _Last1,_Diff2 _Count, const _Ty& _Val);

    template<class _FwdIt1, class _Diff2, class _Ty, class _Pr> inline

      _FwdIt1 search_n(_FwdIt1 _First1, _FwdIt1 _Last1,_Diff2 _Count, const _Ty& _Val, _Pr _Pred);

search_n是从一个[_first1, _last1)范围的数据中查找有_Count个连续的数据,每个数据都和_Val相同。如果找到,它将返回查找到的第一个数据的迭代指针,如果找不到,则返回_last1 。在第二种形式中,可指定确定两个元素何时相等的二元谓词。

    set_difference

    template<class _InIt1, class _InIt2, class _OutIt> inline

      _OutIt set_difference(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2,_OutIt _Dest);

    template<class _InIt1, class _InIt2, class _OutIt, class _Pr> inline

     _OutIt set_difference(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred);

该算法生成包含两个有序的集合之差的序列。这两个集合分别由_First1、_Last1和_First2、_Last2定义。换句话说,要将_First2和_Last2定义的集合从_First1、_Last1所定义的集合中减掉。结果是有序的,并放_Result中。算法返回指向_Result结尾的迭代器。第二种形式中可指定决定两个元素大小关系的比较函数。

注意:两个序列必须是有序的。

    set_intersection

    template<class _InIt1, class _InIt2, class _OutIt> inline

     _OutIt set_intersection(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest);

    template<class _InIt1, class _InIt2, class _OutIt, class _Pr> inline

     _OutIt set_intersection(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred);

生成包含两个有序集合的交集的序列。这两个集合分别由_First1、_Last1和_First2、_Last2定义。结呆序列包含了两个集合共有的元案。结果是有序的,并放_Result中。算法返回指向_Result结尾的迭代器。第二种形式中可指定决定两个元素大小关系的比较函数。

注意:两个序列必须是有序的。

    set_symmetric_difference

    template<class _InIt1, class _InIt2, class _OutIt> inline

     _OutIt set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest);

    template<class _InIt1, class _InIt2, class _OutIt, class _Pr> inline

      _OutIt set_symmetric_difference(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred);

该算法生成包含两个有序集合对称差的序列。这两个集合分别由_First1、_Last1和_First2、_Last2定义。换句话说,。结果集合只包含不为两个集合共有的元素。结果是有序的,并放_Result中。算法返回指向_Result结尾的迭代器。第二种形式中可指定决定两个元素大小关系的比较函数。

注意:两个序列必须是有序的。

    set_union

    template<class _InIt1, class _InIt2, class _OutIt> inline

     _OutIt set_union(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2, _OutIt _Dest);

    template<class _InIt1, class _InIt2, class _OutIt, class _Pr> inline

     _OutIt set_union(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred);

该算法生成包含两个有序集合的并集的序列。这两个集合分别由_First1、_Last1和_First2、_Last2定义。结呆序列包含了两个集合中的所有元案。结果是有序的,并放_Result中。算法返回指向_Result结尾的迭代器。第二种形式中可指定决定两个元素大小关系的比较函数。

注意:两个序列必须是有序的。

    sort

    template<class _RanIt> inline

      void sort(_RanIt _First, _RanIt _Last);

    template<class _RanIt, class _Pr> inline

      void sort(_RanIt _First, _RanIt _Last, _Pr _Pred);

sort()算法对_First和_Last指定的范围进行排序。第二种形式中可指定决定两个元素大小关系的比较函数。

    stable_partition

    template<class _BidIt, class _Pr> inline

      _BidIt stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred);

该算法对_First和_Last定义的序列进行排列,使得所有使_Pred谓词返回true的元素.均位于便谓词返回false的元素之前。划分是稳定的,这表示序列的相对顺序是预定的。算法返回指向使谓词返回false的第一个元素的迭代器。

    stable_sort

    template<class _BidIt> inline

       void stable_sort(_BidIt _First, _BidIt _Last);

    template<class _BidIt, class _Pr> inline

      void stable_sort(_BidIt _First, _BidIt _Last, _Pr _Pred);

算法对_First和_Last指定的范围进行排序,但排序是稳定的,这表示相等的元素不会重新排列。第二种形式中可指定决定两个元素大小关系的比较函数。

    swap

    template<class Type>

     void swap(Type& _Left, Type& _Right);

交换由_Left和_Right引用的值。

    swap_ranges

    template<class _FwdIt1, class _FwdIt2> inline

     _FwdIt2 swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2);

该算法将_First1和_Last1所指定范围中的元素与序列中从_First2处开始的元素相互交换,它返回指向_First2所指定序列结尾的指针。注意,对于交换部分的元素,First1和_Last1所指定范围中的元素个数必须不大于从_First2处开始的元素个数。

    transform

    template<class _InIt, class _OutIt, class _Fn1> inline

     _OutIt transform(_InIt _First, _InIt _Last, _OutIt _Dest,_Fn1 _Func);

    template<class _InIt1, class _InIt2, class _OutIt, class _Fn2> inline

     _OutIt transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,_OutIt _Dest, _Fn2 _Func);

该算法将一个函数应用到元素范围,并将结果存储到_Result中,在第一种形式中.范围是由_First1和_Last1指定的.所应用的函数由_Func指定。这个函数使用自己的参数接收一个元素的值,并必须返回元素的转换结果。

    在第二钟形式中,转换是通过二元运算符函数执行的,函数使用第一个参数从要转换的序列中接收一个元素的值,并用第二个参数接收第二个序列中的—个元素。

    两个版本都返回指向结果序列结尾的迭代器。

示例:

// alg_transform.cpp

// compile with: /EHsc

#include <vector>

#include <algorithm>

#include <functional>

#include <iostream>

 

// The function object multiplies an element by a Factor

template <class Type>

class MultValue

{

   private:

      Type Factor;   // The value to multiply by

   public:

      // Constructor initializes the value to multiply by

      MultValue ( const Type& _Val ) : Factor ( _Val ) {

      }

 

      // The function call for the element to be multiplied

      Type operator ( ) ( Type& elem ) const

      {

         return elem * Factor;

      }

};

 

int main( )

{

   using namespace std;

   vector <int> v1, v2 ( 7 ), v3 ( 7 );

   vector <int>::iterator Iter1, Iter2 , Iter3;

 

   // Constructing vector v1

   int i;

   for ( i = -4 ; i <= 2 ; i++ )

   {

      v1.push_back(  i );

   }

 

   cout << "Original vector  v1 = ( " ;

   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )

      cout << *Iter1 << " ";

   cout << ")." << endl;

 

   // Modifying the vector v1 in place

   transform (v1.begin ( ) , v1.end ( ) , v1.begin ( ) , MultValue<int> ( 2 ) );

   cout << "The elements of the vector v1 multiplied by 2 in place gives:"

        << "/n v1mod = ( " ;

   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )

      cout << *Iter1 << " ";

   cout << ")." << endl;

 

   // Using transform to multiply each element by a factor of 5

   transform ( v1.begin ( ) , v1.end ( ) , v2.begin ( ) , MultValue<int> ( 5 ) );

  

   cout << "Multiplying the elements of the vector v1mod/n "

        <<  "by the factor 5 & copying to v2 gives:/n v2 = ( " ;

   for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )

      cout << *Iter2 << " ";

   cout << ")." << endl;

 

   // The second version of transform used to multiply the

   // elements of the vectors v1mod & v2 pairwise

   transform ( v1.begin ( ) , v1.end ( ) ,  v2.begin ( ) , v3.begin ( ) ,

      multiplies <int> ( ) );

  

   cout << "Multiplying elements of the vectors v1mod and v2 pairwise "

        <<  "gives:/n v3 = ( " ;

   for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )

      cout << *Iter3 << " ";

   cout << ")." << endl;

}

输出结果:

Original vector  v1 = ( -4 -3 -2 -1 0 1 2 ).

The elements of the vector v1 multiplied by 2 in place gives:

 v1mod = ( -8 -6 -4 -2 0 2 4 ).

Multiplying the elements of the vector v1mod

 by the factor 5 & copying to v2 gives:

 v2 = ( -40 -30 -20 -10 0 10 20 ).

Multiplying elements of the vectors v1mod and v2 pairwise gives:

 v3 = ( 320 180 80 20 0 20 80 ).

注意:v2.size()>=v1.size();

    unique  

    template<class _FwdIt> inline

      _FwdIt unique(_FwdIt _First, _FwdIt _Last);

    template<class _FwdIt, class _Pr> inline

       _FwdIt unique(_FwdIt _First, _FwdIt _Last, _Pr _Pred);

该算法从指定范围删除连续的重复元素。在第二种形式中,可指定确定两个元素何时相等的二元谓词。unique返回指向范围结尾的迭代器。  

    unique_copy

    template<class _InIt, class _OutIt> inline

       _OutIt unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest);

    template<class _InIt, class _OutIt, class _Pr> inline

      _OutIt unique_copy(_InIt _First, _InIt _Last, _OutIt _Dest,_Pr _Pred);

该算法复制由_First和_Last指定的范围,并删除其中的连续重复元素。结果放入_Result中。在第二种形式中,可指定确定两个元素何时相等的二元谓词。算法返回指向范围结尾的迭代器。

    upper_bound

    template<class _FwdIt, class _Ty> inline

      _FwdIt upper_bound(_FwdIt _First, _FwdIt _Last, const _Ty% _Val);

    template<class _FwdIt, class _Ty, class _Pr> inline

      _FwdIt upper_bound(_FwdIt _First, _FwdIt _Last,const _Ty% _Val, _Pr _Pred);

该算法在_First和_Last定义的序列中查找大于_Val的第一个元素的位置.它返回指向此位置的迭代器,在第二种形式中,可指定确定两个元素大小关系的比较函数。

C++ STL容器与算法的实用示例详解 本文还有配套的精品资源,点击获取 简介:STL是C++的核心组件,提供了一系列数据结构和算法,使得编程更加高效和灵活。本文首先介绍了STL中的基本容器类型,如Map、Vector、List、Queue、Set和MultiMap,并阐述了它们的特性和适用场景。随后,探讨了STL算法库中常见的函数模板,例如sort()、find()、swap()、copy()和reverse(... 阅读详情

相关推荐

NC65增加自定义参照并且参照数据要根据选择的财务组织过滤

1、首先定义一个参照类 package nc.pub.jzcm.ref; import nc.ui.bd.ref.AbstractRefModel; import nc.ui.bd.ref.IRefDocEdit; import nc.ui.bd.ref.IRefMaintenanceHandler; public class PMPrPayDefaultRefModel extends AbstractRefModel { public PMPrPayDefaultRefModel(){ ...

xyl的博客 3494

STL-算法详解

STL算法是对容器进行处理的函数。 STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。 ...

weixin_48560325的博客 2729

从零到一:高通QCS6490边缘AI开发板的Linux生态构建与实战避坑指南

本文详细介绍了在高通QCS6490边缘AI开发板上构建Linux生态系统的完整流程,包括开发环境准备、系统镜像构建与烧录、AI运行时环境配置、模型部署优化以及性能调试。重点解析了如何利用Hexagon DSP的高达12 TOPS AI算力,并提供了实战中的避坑指南和性能优化技巧,帮助开发者高效实现边缘AI应用从概念验证到产品落地的全过程。

eee77的博客 770

详解c++STL—STL常用算法

详解c++STL—STL常用算法

怀秋秋意的博客 1816

从仿真到打样:PMOS栅极泄放电路设计全流程复盘与三个踩坑点总结

本文详细复盘了PMOS栅极泄放电路从仿真到打样的全流程设计,重点总结了三个关键踩坑点:三极管BE结过压击穿、静态功耗超标和栅极振荡现象。通过优化缓启动电路、改进保护设计和布局调整,最终实现18ms开通时间、190μs关断时间和8μA静态功耗的工业级性能指标,为类似电源开关设计提供实用参考。

weixin_28693683的博客 370

群晖NAS硬盘挂了别慌!用Ubuntu 18外接USB保姆级数据抢救指南

本文提供群晖NAS硬盘故障时的数据抢救指南,详细介绍了使用Ubuntu 18外接USB硬盘盒的完整流程。从构建救援环境、硬盘识别到数据迁移策略,涵盖关键步骤和实用技巧,帮助用户零成本恢复重要数据。特别适合非RAID配置的单盘故障场景。

9o8p7i6u5y的博客 1145

c++11 type_traits类型萃取

一. c++ traits定义 type_traits使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他。 通过type_traits可以实现在编译期计算、查询、判断、转换和选择,增强了泛型编程的能力,也增强了程序的弹性,使得我们在编译期就能做到优化改进甚至排错,能进一步提高代码质量。 二.几个栗子 http://www.cplusplus.com/reference/type_traits/?kw=ty

Wujinchuang的博客 948

python中使用squarify包可视化treemap图:为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小、添加数值数值标签、自定义设置边框的色彩

python中使用squarify包可视化treemap图:treemap将分层数据显示为一组嵌套矩形自定义设置每一个数据格的颜色、添加数值数值标签、自定义设置边框的色彩、自定义设置边框线条的粗细、为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小

data+scenario+science+insight 1061

C++STL学习第三讲(讲解 STL 算法 Algorithm)

C++STL学习第三讲(讲解 STL 算法 Algorithm)

weixin_41736570的博客 863

【地图模块算法】二维全局地图的开源方案及对比--gmapping、hector、karto、cartographer

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、gmapping算法建图【基于Raoo-Blackwellized粒子滤波(RBPF)算法】1.gmapping理论(1)gmapping的工作原理(2)gmapping的算法流程(3)gmapping论文理论2.gmappingROS工程框架解析(1)gmapping的功能包架构(2)gmapping订阅和发布的话题(3)gmapping算法建图参数(4)gmapping源码

qq_35635374的博客 3436

具身智能(40):主流 VLA 模型π₀

摘要: π₀是首款专为机器人设计的VLA(视觉-语言-动作)端到端基础模型,通过双阶段训练实现“感知-决策-执行”闭环。其创新点包括:1)FlowMatching技术实现连续平滑动作控制(精度0.3°);2)结合VLM预训练与多机器人实操数据,零样本任务完成率达76.4%,远超同类模型;3)支持模糊指令理解与动态场景适应(如遮挡识别)。开源版本涵盖不同规模模型,适用于工业装配、服务机器人等场景,在延迟(213ms)和稳定性(92%自主恢复率)上显著领先OpenVLA等竞品。

码农17年的博客 509

【C++】STL学习小总结

【C++】STL学习小总结 STL概述 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。 复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorith

ZYP_997_的博客 4661

如何提高电路的抗干扰能力

本内容详细介绍了电源传导干扰处理,包括滤波、Feedthrough电容器、磁环、磁珠、屏蔽的使用与选型,EMC电磁兼容测试项目简介与要求,单片机与电源抗干扰处理等。

让你爱上电路设计 8595

STL介绍及常用算法详解

两个容器,分别是"有序集合"和"有序多重集合",即前者的元素不能重复,而后者可以包含若干个相等的元素。set 和 multiset 的内部实现是一棵红黑树,它们支持的函数基本相同。,因为它们都是容器,容器的clear函数会清空容器中的所有元素,而队列,优先队列和栈中的元素是动态申请的,所以没有必要提供clear函数。提供一种方法,使之能够依序寻访某个容器所合的各个元素,而又无需暴露该容器的内部表示方式每个容器都有自己专属的迭代器。(即弹出的元素十最后一个插入的元素)栈和队列是相似的,只不过它是。

LJJJJ7的博客 1517

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

算法竞赛C++ STL容器、算法、迭代器详解

C++ STL详解(建议收藏!!!) 本蒟蒻写这篇分享的目的一个是为了写一个归纳总结方便自己以后随时能够复习还有就是给那些对STL还不是很了解的萌新介绍一下什么是STL以及如何使用STL更高效偷懒地解题。本篇文章将会长期更新,欢迎大家一起监督学习,有错误的地方或者需要补充的欢迎在评论区留言哦~跳转至AcWing~ 一、什么是STL? STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现主要出现在C++中,STL从广义上分为:容器(container

一只快乐的小蒟蒻~ 5333

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

stl 算法c语言有吗,STL算法详解

STL 提供能在各种容器中通用的算法(大约有70种),如插入、删除、查找、排序等。算法就是函数模板。算法通过迭代器来操纵容器中的元素。许多算法操作的是容器上的一个区间(也可以是整个容器),因此需要两个参数,一个是区间起点元素的迭代器,另一个是区间终点元素的后面一个元素的迭代器。例如,排序和查找算法都需要这两个参数来指明待排序或待查找的区间。有的算法返回一个迭代器。例如,find 算法在容器中查找一...

weixin_28894541的博客 394

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++中的STL算法详解

1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入、删除、查找、排序等。算法就是函数模板,算法通过迭代器来操纵容器中的元素。许多算法操作的是容器上的一个区间(也可以是整个容器),因此需要两个参数,一个是区间起点元素的迭代器,另一个是区间终点元素的后面一个元素的迭代器。例如,排序和查找算法都需要这两个参数来指明待排序或待查找的区间。有的算法返回一个迭代器,例如,find...

CurryCoder的个人博客 640

STL中的常用算法详解

STL的算法主要是由下面的头文件组成的。1.algorithm是所有STL头文件中最大的一个范围涉及到比较、交换、查找、遍历操作、复制、修改等等算法的头文件。2.numeric体积很小,只包括几个再序列上面进行简单数学运算的模板函数。3.functional定义了一些模板类,用以声明函数对象。4.如果读者还未知晓什么是仿函数,建议了解一下。

行到水穷处,坐看云起时。 605

C++标准库:STL容器与算法详解

1.背景介绍 1. 背景介绍 C++标准库是C++程序设计中不可或缺的一部分,它提供了丰富的数据结构、算法和工具,帮助开发者更高效地编写程序。STL(Standard Template Library)是C++标准库中最重要的一部分,它提供了一系列模板类和模板函数,用于实现各种常用的数据结构和算法。 在本文中,我们将深入探讨STL容器和算法的相关概念、原理、实践和应用。我们将涵盖STL容器的...

AI天才研究院 1368

C++STL在算法竞赛中的应用详解

本篇博客详细讲述C++的STL中的内容在算法竞赛中的作用,包括数据类型和常用函数

yxc_71411的博客 1404

C++ STL 容器与算法详解

本文总结了常见容器和算法的特点与应用场景。容器部分包括序列容器(vector、deque、list)、关联容器(set、map)及无序关联容器,比较了它们的内存结构、操作效率和使用场景。算法部分涵盖了非修改序列算法(find、count)、修改序列算法(copy、reverse)、排序算法(sort、binary_search)以及数值算法等,并给出了时间复杂度说明。最后推荐了洛谷上相关的练习题,如P3613(vector操作)、P1090(优先队列)等,帮助理解不同容器和算法的实际应用。

qq_16759367的博客 725

STL之remove算法详解

算法描述接口template<class ForwardIterator, class Type> ForwardIterator remove( ForwardIterator _First, ForwardIterator _Last, const Type& _Val );功能将一个指定的值从指定的区间中[first,last)“删除”,这里的“

Keep Moving~ 1372

STL排序算法详解

本文详细解析了STL中的三种排序算法:sort(混合排序,不稳定,O(nlogn))、partial_sort(堆排序思想,获取前N个元素,O(nlogk))和stable_sort(归并排序,稳定但需额外空间)。通过性能测试对比了它们的效率差异,并提供了具体应用场景建议:sort适用于通用排序,partial_sort适合Top-K问题,stable_sort用于需要保持元素顺序的情况。文章还给出了代码优化建议,帮助开发者根据实际需求选择最合适的排序方法。

2402_82668550的博客 596

详解C++ STL内置函数与算法

除了升序和降序这种基本的排序需求,在实际编程中,我们常常会遇到更加复杂的情况,需要根据特定的规则对数据进行排序。这时,sort函数允许我们自定义比较函数,以实现个性化的排序逻辑。例如,我们有一个包含学生信息的结构体Student,每个学生有姓名和成绩两个属性,现在我们希望按照成绩从高到低对学生进行排序,如果成绩相同,则按照姓名的字典序进行排序。int score;在上述代码中,我们定义了一个compareStudents函数作为自定义比较函数。

weixin_62059655的博客 920

STL中的排序算法详解

1. 所有STL sort算法函数的名字列表: 函数名             功能描述 sort          对给定区间所有元素进行排序 stable_sort     对给定区间所有元素进行稳定排序 partial_sort     对给定区间所有元素部分排序 partial_sort_copy    对给定区间复制并排序 nth_element     找出给定区间的某个位

人生代码,代码人生。。。 1086

C++ STL常用算法(详解)

作为一门面向对象的编程语言,使用 C++ 编写程序有一个缺点,即随着代码面向对象程度的提高,其执行效率反而会降低。例如,经实验证明几乎在所有情况下,直接操作一个 double 类型变量的执行效率,要比操作一个含 double 类型成员属性的类对象更高。对于大多数读者来说,以上所说是很容易想通的,因为它符合我们对高级编程语言的认知。但本节要介绍的内容,一定程序上会打破这个认知。

qq_25218501的博客 898
上一篇: 内存管理------最优适应算法
下一篇: 理想与行动
sun_top
博客等级 码龄18年 54粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值