[C++ 11] Range-based For
来源:互联网 发布:知润山产权问题 编辑:程序博客网 时间:2024/06/05 15:48
Range-based For 的一般形式
想要遍历C++的各个容器类型以及原生数组,除了使用下标以及迭代器访问之外,还可以使用C++11的一种新的for循环形式,Range-based For。其一般的形式:
for (declaration : expression) { statement;}
以下是一个使用的例子:
#include<iostream>int main() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (auto it : a) { std::cout << it << ' '; } return 0;}
打开编译器的”std=c++11”选项,可以得到输出
1 2 3 4 5 6 7 8 9 10
有关 Range-based For
输出顺序
在标准STL容器中,使用Range-based For得到的输出与使用其iterator得到的输出一致。虽然string并不是狭义上的STL容器,然而string在使用Range-based For时也是以iterator的顺序为顺序。
比如以下这个例子:
#include<iostream>#include<string>#include<vector>int main() { std::string str("range-based for"); std::vector<int> vec { 1, 3, 5, 7, 9, 2}; std::cout << "对string使用iterator: "; for (auto it = str.begin(); it != str.end(); it++) { std::cout << *it; } std::cout << "\n对string使用Range-based for: " ; for (auto it : str) { std::cout << it; } std::cout << "\n对vector使用iterator: "; for (auto it = vec.begin(); it != vec.end(); it++) { std::cout << *it << ' '; } std::cout << "\n对vector使用Range-based for: "; for (auto it : vec) { std::cout << it << ' '; } std::cout << std::endl; return 0;}
编译运行,得到输出结果:
对string使用iterator: range-based for对string使用Range-based for: range-based for对vector使用iterator: 1 3 5 7 9 2对vector使用Range-based for: 1 3 5 7 9 2
使用引用来修改对象
需要注意的是,在默认的设计中,我们得到的是值的一个拷贝,直接修改是不影响原值的,如果我们想要依次修改对象,我们可以使用以下的形式:
for (auto &it : container) { statement;}
比如,下面的程序将一个小写字符串转换为大写字符串:
#include<iostream>#include<string>#include<cctype>int main() { std::string str("rangebasedfor"); for (auto &it : str) { it = toupper(it); } std::cout << str << std::endl; return 0;}
运行结果:
RANGEBASEDFOR
容器的元素数量不应发生变化
在Range-based For循环中,不应当发生在容器中增加或者减少元素的情况,若发生了这种情况,可能并不会得到你所期望得到的结果,比如,对于以下例子:
#include<iostream>#include<vector>int main() { std::vector<int> vec { 1, 3 }; for (auto it : vec) { std::cout << it << ' '; vec.push_back(2); } return 0;}
也许用户本期望得到的结果是:
1 3 2
然而实际上,执行该程序,得到的输出为:
1 0
阅读全文
1 0
- [C++ 11] Range-based For
- C++11 range-based for loops
- C++11 性能Range-based for loops
- c++11 : range-based for loop
- C++11 | range-based for loop
- range-based for() loop
- Range based for loop
- C++11 新特性之Range-based for loops
- Modern C++(二)Range-based for loop(基于范围的for循环)
- Cpp_Primer--using注意事项 与 Range-Based for
- C++11新特性:range based for loop-范围for循环基本使用方法
- C++11新特性之基本范围的For循环(range-based-for)
- C++11中的有趣的新特性(constexpr ) (Range-based for loop)
- C++11中range-based for loops中&&与&的区别
- C++11/C++14 (三)TYPE INFERENCE (AUTO) AND RANGE-BASED FOR LOOP
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
- c++ 11 for range
- c++11 for range
- android 打包 eclipse 错误 Export aborted because fatal lint errors were found
- tensorflow实现图像的翻转
- 18121 排排坐看电影
- 『ORACLE』 对永久表空间进行DML操作(11g)
- android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment xxx.fragments
- [C++ 11] Range-based For
- spring+springmvc+mybatis搭建的一个java系统
- day5 linux操作基础命令 第二弹
- HBase + ES 插入查询测试
- Java通过JDBC连接oracle数据库
- IE下Cookie中文不乱码
- MyEclipse的使用
- 离散题目8
- rest api 的首次尝试