C++11 | range-based for loop

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)

你可能感兴趣的:(C++,for,C++11,for-each,range-for)