zoukankan      html  css  js  c++  java
  • 现代C++ 基于范围的for和for_each语句

    现代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 10
    Test 2 : 1 2 3 4 5 6 7 8 9 10
    Test 3 : 1 2 3 4 5 6 7 8 9 10
    Test 4 : 1 2 3 4 5 6 7 8 9 10
    Test 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 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
       void operator ( ) ( Type& elem ) const
       {
          elem *= Factor;
       }
    };
    
    // The function object to determine the average
    class Average
    {
    private:
       long num;      // The number of elements
       long sum;      // The sum of the elements
    public:
       // 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
     "
            <<  "by the factor -2 gives:
     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
     "
            <<  "by the factor 5 gives:
     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:
     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.
  • 相关阅读:
    关于LWIP断开网线后重连问题(热插拔问题)
    仿招商银行载入loading效果
    x264代码剖析(十五):核心算法之宏块编码中的变换编码
    Spring Boot + Jersey
    HDU
    OVS中对于用户层和datapath层的多个通道利用epoll进行控制
    Apache的.htaccess项目根文件夹伪静态设置规则
    poj 3071 Football(线段树+概率)
    AS2.0鼠标尾随和拖动代码
    RelativeLayout经常使用属性介绍及实例解说
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332232.html
Copyright © 2011-2022 走看看