大佬教程收集整理的这篇文章主要介绍了C++11中基于范围的for循环,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <iostream> #include <vector> int main(void) { std::vector<int> arr; // ... for(auto it = arr.begin(); it != arr.end(); ++it) { std::cout << *it << std::endl; } return 0; }上面借助前面介绍过的 C++ auto 关键字,省略了迭代器的声明。
#include <algorithm> #include <iostream> #include <vector> void do_cout(int n) { std::cout << n << std::endl; } int main(void) { std::vector<int> arr; // ... std::for_each(arr.begin(),arr.end(),do_cout); return 0; }std::for_each 比起前面的 for 循环,最大的好处是不再需要关注迭代器(Iterator)的概念,只需要关心容器中的元素类型即可。
int[] fibarray = new int[] { 0,1,2,3,5,8,13 }; foreach (int element in fibarray) { System.Console.WriteLine(element); }上面这段代码通过“foreach”关键字使用了基于范围的 for 循环。可以看到,在这种 for 循环中,不再需要传递容器的两端,循环会自动以容器为范围展开,并且循环中也屏蔽掉了迭代器的遍历细节,直接抽取出容器中的元素进行运算。
#include <iostream> #include <vector> int main(void) { std::vector<int> arr = { 1,3 }; // ... for(auto n : arr) //使用基于范围的for循环 { std::cout << n << std::endl; } return 0; }在上面的基于范围的 for 循环中,n 表示 arr 中的一个元素,auto 则是让编译器自动推导出 n 的类型。在这里,n 的类型将被自动推导为 vector 中的元素类型 int。
:
,之后直接写上需要遍历的表达式,for 循环将自动以表达式返回的容器为范围进行迭代。
std::vector<int> arr;
for(int n : arr) ;
std::vector<int> arr;
for(char n : arr) ; // int会被隐式转换为char
for(auto& n : arr) { std::cout << n++ << std::endl; }在完成上面的遍历后,arr 中的每个元素都会被自加 1。
#include <iostream> #include <map> int main(void) { std::map<std::string,int> mm = { { "1",1 },{ "2",2 },{ "3",3 } }; for(auto& val : mm) { std::cout << val.first << " -> " << val.second << std::endl; } return 0; }这里需要注意两点:
std::map<std::string,int> mm = { { "1",3 } }; for(auto ite = mm.begin(); ite != mm.end(); ++itE) { std::cout << ite->first << " -> " << ite->second << std::endl; } for(auto& val : mm) // 使用基于范围的for循环 { std::cout << val.first << " -> " << val.second << std::endl; }从这里就可以很清晰地看出,在基于范围的 for 循环中每次迭代时使用的类型和普通 for 循环有何不同。
#include <iostream> #include <set> int main(void) { std::set<int> ss = { 1,3 }; for(auto& val : ss) { // error: increment of read-only reference 'val' std::cout << vaL++ << std::endl; } return 0; }例子中使用 auto& 定义了 std::set<int> 中元素的引用,希望能够在循环中对 set 的值进行修改,但 std::set 的内部元素是只读的——这是由 std::set 的特征决定的,因此,for 循环中的 auto& 会被推导为 const int&。
#include <iostream> #include <vector> std::vector<int> arr = { 1,4,5 }; std::vector<int>& get_range(void) { std::cout << "get_range ->: " << std::endl; return arr; } int main(void) { for(auto val : get_range()) { std::cout << val << std::endl; } return 0; }输出结果:
#include <iostream> #include <vector> int main(void) { std::vector<int>arr = { 1,5 }; for(auto val : arr) { std::cout << val << std::endl; arr.push_BACk(0); // 扩大容器 } return 0; }执行结果(32位mingw4.8):
#include <iostream> #include <vector> int main(void) { std::vector<int> arr = { 1,5 }; auto && __range = (arr); for (auto __begin = __range.begin(),__end = __range.end(); __begin != __end; ++__begin) { auto val = *__begin; std::cout << val << std::endl; arr.push_BACk(0); // 扩大容器 } return 0; }从这里可以很清晰地看到,和我们平时写的容器遍历不同,基于范围的 for 循环倾向于在循环开始之前确定好迭代的范围,而不是在每次迭代之前都去调用一次 arr.end()。
以上是大佬教程为你收集整理的C++11中基于范围的for循环全部内容,希望文章能够帮你解决C++11中基于范围的for循环所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。