现代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
- 现代C++ 基于范围的for和for_each语句
- 基于范围的 for 语句 (C++)
- C++中基于范围的for语句
- std 中for_each 算法与c++11范围for语句
- 【C++ STL应用与实现】26: 如何使用std::for_each以及基于范围的for循环 (since C++11)
- C++11特性——基于范围的for语句
- [C++] 使用基于范围的for循环操作string
- 基于范围的for循环
- 基于范围的for循环
- Modern C++(二)Range-based for loop(基于范围的for循环)
- 使用范围for语句和while循环以及传统for的区别
- STL通用算法: for_each,c++11标准范围for,transform.
- C++ 基于范围的for循环
- c++ 11 基于范围的for循环
- (七十六)基于范围的for循环
- C++11 基于范围的for循环
- 基于范围的for循环(C++11)
- 范围for语句
- vector::push_back
- Android技巧小结之Service调用
- ASP.NET连接ACCESS数据库WEB.CONFIG内路径最优写法
- ButterKnife源码解析
- 节省空间
- 现代C++ 基于范围的for和for_each语句
- #hihocoder #1081 : 最短路径·一
- jeesite dbname 问题
- 联萌十一大决战之如日中天 C. Cinderella(灰姑娘新编)
- BZOJ 3231: [Sdoi2008]递归数列
- 变量初始化规则以及声明和定义
- Android Studio 配置优化
- AVL树的思想与C++实现
- LeetCode -- Construct Binary Tree from Inorder and Postorder Traversal