标签:引用类型 代码 func 成员 for循环 effective 功能 类型 序列
1、C++使用如下方法遍历一个容器:
#include "stdafx.h" #include<iostream> #include<vector> int main() { std::vector<int> arr; arr.push_back(1); arr.push_back(2); for (auto it = arr.begin(); it != arr.end(); it++) { std::cout << *it << std::endl; } return 0; }
2、同时使用std::for_each可以完成同样的功能(在头文件 #include <algorithm> 中),但是for_each的代码更简洁。
for_each事实上是个function template,其实质如下[effective STL item 41]:
template<typename InputIterator, typename Function> Function for_each(InputIterator beg, InputIterator end, Function f) { while(beg != end) f(*beg++); }
使用for_each循环遍历如下:
#include "stdafx.h" #include<algorithm> #include<iostream> #include<vector> void func(int n) { std::cout << n << std::endl; } int main() { std::vector<int> arr; arr.push_back(1); arr.push_back(2); std::for_each(arr.begin(), arr.end(), func); return 0; }
3、C++11新标准引入了更简单的for语句,这种语句可以遍历容器或其它序列的所有元素。范围for语句(rang for statement)的语法形式是:
for (declaration : expression) statement
expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者vector或string等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员。
declaration定义一个变量,序列中的每个元素都能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符,这个关键字可以令编译器帮助我们指定合适的类型。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。
每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值,之后才会执行statement。像往常一样,statement可以之一套单独的语句也可以是一个块。所有元素都处理完毕后循环终止。
范围for语句的定义来源于与之等价的传统for语句:
for (auto beg = v.begin(), end = v.end(); beg != end; ++beg ){ auto &r = *beg; //r必须是引用类型,这样才能对元素执行写操作 r *= 2; //将v中每个元素的值翻倍 }
for循环新用法:
#include "stdafx.h" #include<iostream> #include<vector> int main() { std::vector<int> arr; arr.push_back(1); arr.push_back(2); for (auto n : arr) { std::cout << n << std::endl; } return 0; }
标签:引用类型 代码 func 成员 for循环 effective 功能 类型 序列
原文地址:https://www.cnblogs.com/Maurice-code/p/10605544.html