天天看點

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 = { , , , ,  };
    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",  }, { "John",  } };
    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",  }, { "John",  } };
    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 += ;
    }
    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 = { , ,  };
    for (auto n : numberArray) std::cout << n << "  ";
    std::cout << std::endl << std::endl;
           

range-based for loop的介紹就到這裡了,相信已經比較清楚了。

參考:

  • C++11 | 自動類型推斷——auto
  • C++11 | 運作時類型識别(RTTI)