现代C++ 基于范围的for和for_each语句

来源:互联网 发布:淘宝店提高销量 编辑:程序博客网 时间:2024/04/28 01:35

现代C++中强调,使用基于范围的 for 循环(Visual studio 2012之后的),相比于旧版的 for 循环更整洁和易于使用,并且不容易发生意外错误。让我们一睹为快。

当然,使用前需要包含头文件:

#include <algorithm>

1 基于范围的for语句

基于范围的for语句(Range-based for Statement),其语句形式为:

for ( for-range-declaration : expression )    statement

看一段示例代码:

#include <iostream>#include <vector>using namespace std;int main() {    cout << "Test 1 : ";    // Basic 10-element integer array.    int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    // Range-based for loop to iterate through the array.    for( int y : x ) { // Access by value using a copy declared as a specific type.                        // Not preferred.        cout << y << " ";    }    cout << endl;    cout << "Test 2 : ";    // The auto keyword causes type inference to be used. Preferred.    for( auto y : x ) { // Copy of 'x', almost always undesirable        cout << y << " ";    }    cout << endl;    cout << "Test 3 : ";    for( auto &y : x ) { // Type inference by reference.        // Observes and/or modifies in-place. Preferred when modify is needed.        cout << y << " ";    }    cout << endl;    cout << "Test 4 : ";    for( const auto &y : x ) { // Type inference by reference.        // Observes in-place. Preferred when no modify is needed.        cout << y << " ";    }    cout << endl;    cout << "Test 5 : ";    // Create a vector object that contains 10 elements.    vector<double> v;    for (int i = 0; i < 10; ++i) {        v.push_back(i + 0.14159);    }    // Range-based for loop to iterate through the vector, observing in-place.    for( const auto &j : v ) {        cout << j << " ";    }    cout << endl;}

输出结果为:

Test 1 : 1 2 3 4 5 6 7 8 9 10Test 2 : 1 2 3 4 5 6 7 8 9 10Test 3 : 1 2 3 4 5 6 7 8 9 10Test 4 : 1 2 3 4 5 6 7 8 9 10Test 5 : 0.14159 1.14159 2.14159 3.14159 4.14159 5.14159 6.14159 7.14159 8.14159 9.14159

2 for_each语句

for_each语句,其语句形式为:

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

其中,_First是迭代器对应起始元素位置,_Last是迭代器对应的结束位置,必须是序列中可以访问的位置,_Func是用户定义的函数对象,将在迭代器范围内的所有元素,均应用到该函数中。

看一段代码示例:

// alg_for_each.h#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);   }};
// main.cpp#include "alg_for_each.h"void main( ){   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.
1 0
原创粉丝点击