您的位置:首页 > 编程语言 > C语言/C++

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的基本语法如下:

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: