C++11 | range-based for loop
2016-06-06 13:13
344 查看
C++11里支持range-based for loop了,到这里可以看到完整的语法及示例:http://en.cppreference.com/w/cpp/language/range-for。英文的,我用中文演绎一下。
range-based for loop的基本语法如下:
做一个简单说明:
range_declaration,变量声明,就像for循环里的初始化部分一样,比如
range_expression,序列,可以是STL里的vector、list、map等等,也可以是数组,甚至可以是一个花括号声明的初始化列表。
loop_statement,循环体,这部分和for一致了,里面可以使用range_declaration里声明的变量,做你想做的事儿。循环体里也可以使用continue、break等语句,和for一样一样的。
在C++11 | 自动类型推断——auto中其实我们已经用过range-for了,这里再举几个简单的例子:
上面的代码我们演示了range-based for loop的基本用法。
range-for的range_declaration部分,可以用具体的类型来声明变量,也可以使用auto。这部分声明的变量,既可以是值,也可以是引用。当你声明一个引用变量时,还可以修改range_expression所代表的容器内的数据。代码片段:
range-for的range_expression可以是C风格的数组、STL容器或者花括号初始化列表(实际上会被转化为std::initializer_list),还可以是C++11引入的array,代码片段如下:
range-based for loop的介绍就到这里了,相信已经比较清楚了。
参考:
C++11 | 自动类型推断——auto
C++11 | 运行时类型识别(RTTI)
range-based for loop的基本语法如下:
for ( range_declaration : range_expression ) loop_statement
做一个简单说明:
range_declaration,变量声明,就像for循环里的初始化部分一样,比如
for(int n : numbers)中的
int n就是变量声明。它的类型,与后面的序列(容器)中存储的数据的类型一致。
range_expression,序列,可以是STL里的vector、list、map等等,也可以是数组,甚至可以是一个花括号声明的初始化列表。
loop_statement,循环体,这部分和for一致了,里面可以使用range_declaration里声明的变量,做你想做的事儿。循环体里也可以使用continue、break等语句,和for一样一样的。
在C++11 | 自动类型推断——auto中其实我们已经用过range-for了,这里再举几个简单的例子:
int _tmain(int argc, _TCHAR* argv[]) { const char *helloWorld[] = { "Hello", "World", "!" }; std::cout << "range-for on C-style array:\n " ; for (const char *word : helloWorld) { std::cout << word << " "; } std::cout << std::endl << std::endl; std::vector<int> numbers = { 1, 3, 2, 9, 4 }; std::cout << "range-for on vector: "; for (int n : numbers) { std::cout << " " << n; } std::cout << std::endl << std::endl; std::cout << "range-for on map:" << std::endl; std::map<std::string, int> name2age = { { "Mary", 28 }, { "John", 32 } }; for (auto person : name2age) { std::cout << " name = " << person.first.c_str() << " age = " << person.second << std::endl; } std::cout << std::endl; std::cout << "range-for on braced-init-list:\n "; for (auto ch : { 'a', 'e', 'i', 'o', 'u' }) { std::cout << ch << " "; } std::cout << std::endl << std::endl; }
上面的代码我们演示了range-based for loop的基本用法。
range-for的range_declaration部分,可以用具体的类型来声明变量,也可以使用auto。这部分声明的变量,既可以是值,也可以是引用。当你声明一个引用变量时,还可以修改range_expression所代表的容器内的数据。代码片段:
std::cout << "range-for on map:" << std::endl; std::map<std::string, int> name2age = { { "Mary", 28 }, { "John", 32 } }; for (auto person : name2age) { std::cout << " name = " << person.first.c_str() << " age = " << person.second << std::endl; } std::cout << std::endl; std::cout << "range-for on map, use reference :" << std::endl; for (auto &person : name2age) { person.second += 2; } for (auto person : name2age) { std::cout << " name = " << person.first.c_str() << " age = " << person.second << std::endl; }
range-for的range_expression可以是C风格的数组、STL容器或者花括号初始化列表(实际上会被转化为std::initializer_list),还可以是C++11引入的array,代码片段如下:
std::cout << "range-for on C++11 array:\n "; std::array<int, 3> numberArray = { 2, 4, 6 }; for (auto n : numberArray) std::cout << n << " "; std::cout << std::endl << std::endl;
range-based for loop的介绍就到这里了,相信已经比较清楚了。
参考:
C++11 | 自动类型推断——auto
C++11 | 运行时类型识别(RTTI)
相关文章推荐
- C# vs C++ 全局照明渲染性能比试
- GNU C 、ANSI C、标准C、标准c++的区别和联系
- 第十五周c++范型程序补充阅读(1)
- c++11 algorithm 常用的容器算法
- [C++]_[线程池的简单实现]
- c++第七次作业
- dev 错误窗口打开
- 第七次c++作业
- 转:C++ 性能测试支持
- C++Primer Chapter3课后习题
- std::shared_ptr的巧妙应用
- c++第七次上机-特殊三位数
- C++类访问控制及继承
- C++虚析构函数
- C\\C++语言杂谈
- C++ 虚函数表解析
- C++ 实现DLL注入(一)实现
- 程序自我复制(c++)
- 汉诺塔实现程序(C++)
- C++面试笔记--继承和接口