c++ 標準模板庫 STL 演算法之 for_each 函數的使用用法詳解

來源:互聯網
上載者:User

std::for_each

template <class InputIterator, class Function>   Function for_each (InputIterator first, InputIterator last, Function fn);
Apply function to range

Applies function fn to each of the elements in the range [first,last).

The behavior of this template function is equivalent to:

123456789
template<class InputIterator, class Function>  Function for_each(InputIterator first, InputIterator last, Function fn){  while (first!=last) {    fn (*first);    ++first;  }  return fn;      // or, since C++11: return move(fn);}




Parameters
first, last
Input iterators to the initial and final positions in a sequence. The range used is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
fn
Unary function that accepts an element in the range as argument.
This can either be a function pointer or a move constructible function object.

Its return value, if any, is ignored.

Applies a specified function object to each element in a forward order within a range and returns the function object.

  
template<class InputIterator, class Function>    Function for_each(       InputIterator _First,        InputIterator _Last,        Function _Func    );
Parameters

_First

An input iterator addressing the position of the first element in the range to be operated on.

_Last

An input iterator addressing the position one past the final element in the range operated on.

_Func

User-defined function object that is applied to each element in the range.

Return Value

A copy of the function object after it has been applied to all of the elements in the range.

Remarks

The algorithm for_each is very flexible, allowing the modification of each element within a range in different, user-specified ways. Templatized functions may be reused in a modified form by passing different parameters. User-defined functions may accumulate information within an internal state that the algorithm may return after processing all of the elements in the range.

The range referenced must be valid; all pointers must be dereferenceable and, within the sequence, the last position must be reachable from the first by incrementation.

The complexity is linear with at most (_Last – _First) comparisons.

 

標頭檔:

<algorithm>

說明:

for_each 演算法範圍 [_First, _ Last) 中的每個元素調用函數_Fn1,並返回輸入的參數 _Func。此函數不會修改序列中的任何元素。

 

// for_each example#include <iostream>     // std::cout#include <algorithm>    // std::for_each#include <vector>       // std::vector#include <list>void myfunction (int i){  // function:  std::cout << ' ' << i;}struct myclass{           // function object type:  void operator() (int i) {std::cout << ' ' << i;}} myobject;void test_my(){    std::vector<int> myvector;    myvector.push_back(10);    myvector.push_back(20);    myvector.push_back(30);    std::cout << "myvector contains:";    for_each (myvector.begin(), myvector.end(), myfunction);    std::cout << '\n';    // or:    std::cout << "myvector contains:";    for_each (myvector.begin(), myvector.end(), myobject);    std::cout << '\n';    std::cout << "myvector contains:";    for_each (myvector.begin(), myvector.end(), myclass());    std::cout << '\n';}/******運行結果:myvector contains: 10 20 30myvector contains: 10 20 30myvector contains: 10 20 30******///print為仿函數struct print{    int count;    print(){count = 0;}    void operator()(int x)    {        std::cout << x << std::endl;        ++count;    }};void test_print(){    using namespace std;    list<int> testlist;    //初始化    for ( size_t i = 1991; i <2013 ; ++i)    {        testlist.push_back(i);    }    //遍曆testlist元素並列印    print p = for_each(testlist.begin(), testlist.end(), print());    //列印testlist元素個數    cout << "元素個數是:"<<p.count << endl;}/******運行結果:1991199219931994199519961997199819992000200120022003200420052006200720082009201020112012元素個數是:22******/class Multi_By_x{    private:        int multiplier;    public:        Multi_By_x(const int& k) : multiplier(k) { }        void operator()(const int& x) { std::cout << x * multiplier << " " << std::endl; }};void test_Multi_By_x(){  int sequence[6] = {2007,2010,2011,2012,2013,2014};  using std::vector;  vector<int>  v(sequence, sequence+6);  Multi_By_x Multi2(2);  for_each(v.begin(),v.end(),Multi2);   // Apply function}/*************運行結果:401440204022402440264028*************/int main (){    test_my();    std::cout<<"\n***************************************************\n";    test_print();    std::cout<<"\n***************************************************\n";    test_Multi_By_x();    std::cout<<"\n***************************************************\n";    return 0;}/***************myvector contains: 10 20 30myvector contains: 10 20 30myvector contains: 10 20 30***************************************************1991199219931994199519961997199819992000200120022003200420052006200720082009201020112012元素個數是:22***************************************************401440204022402440264028***************************************************Process returned 0 (0x0)   execution time : 0.039 sPress any key to continue.****************/

再看一下MSDN上邊給出的例子程式

 

 

#include <vector>#include <algorithm>#include <iostream>// The function object multiplies an element by a Factortemplate <class Type>class MultValue{private:   Type Factor;   // The value to multiply bypublic:   // Constructor initializes the value to multiply by   MultValue ( const Type& _Val ) : Factor ( _Val )   {   }   // The function call for the element to be multiplied   void operator ( ) ( Type& elem ) const   {      elem *= Factor;   }};// The function object to determine the averageclass Average{private:   long num;      // The number of elements   long sum;      // The sum of the elementspublic:   // Constructor initializes the value to multiply by   Average ( ) : num ( 0 ) , sum ( 0 )   {   }   // The function call to process the next elment   void operator ( ) ( int elem )   {      num++;      // Increment the element count      sum += elem;   // Add the value to the partial sum   }   // return Average   operator double ( )   {      return  static_cast <double> (sum)/static_cast <double> (num);   }};int main( ){   using namespace std;   vector <int> v1;   vector <int>::iterator Iter1;   // 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;   // Using for_each to multiply each element by a Factor   for_each ( v1.begin ( ) , v1.end ( ) , MultValue<int> ( -2 ) );   cout << "Multiplying the elements of the vector v1\n "        <<  "by the factor -2 gives:\n v1mod1 = ( " ;   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )      cout << *Iter1 << " ";   cout << ")." << endl;   // The function object is templatized and so can be   // used again on the elements with a different Factor   for_each (v1.begin ( ) , v1.end ( ) , MultValue<int> (5 ) );   cout << "Multiplying the elements of the vector v1mod\n "        <<  "by the factor 5 gives:\n v1mod2 = ( " ;   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )      cout << *Iter1 << " ";   cout << ")." << endl;   // The local state of a function object can accumulate   // information about a sequence of actions that the   // return value can make available, here the Average   double avemod2 = for_each ( v1.begin ( ) , v1.end ( ) ,Average ( ) );   cout << "The average of the elements of v1 is:\n Average ( v1mod2 ) = "        << avemod2 << "." << endl;}/*****************運行結果如下:Original vector  v1 = ( -4 -3 -2 -1 0 1 2 ).Multiplying the elements of the vector v1 by the factor -2 gives: v1mod1 = ( 8 6 4 2 0 -2 -4 ).Multiplying the elements of the vector v1mod by the factor 5 gives: v1mod2 = ( 40 30 20 10 0 -10 -20 ).The average of the elements of v1 is: Average ( v1mod2 ) = 10.Process returned 0 (0x0)   execution time : 0.122 sPress any key to continue.******************/

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.