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)