許多程式語言支援 for 迴圈的稱之為 for each 的變體,即針對集合中的元素重複一組語句。在 c++11 之前 c++沒有相應的核心語言支援。最接近的特性是來自標準庫中的被稱為 std::for_each 的通用演算法,它在範圍的所有元素上應用乙個函式。c++11 帶來了對 for each 的語言級支援,實際稱之為基於範圍 for 迴圈。新的 c++17 標準對原始語言特性提供了一些改進。
在 c++11 中,基於範圍 for 迴圈的通用語法如下:
1
for (range_declaration : range_expression) loop_statement
為了舉例說明基於範圍的 for 迴圈的不同用法,我們將使用下面這些函式返回元素序列:
1
std::vector
getrates()
2;4}56
std::multimap
getrates2()
7,10 ,
11 ,
12 ,
13 ,
14 ,
15
16 };
17}
基於範圍的 for 迴圈可以通過不同的方式使用:
1
auto rates = getrates();
2for (int rate : rates)
3std::cout
<< rate << std::endl;45
for (int &rate : rates)
6 rate *= 2;
1
for (auto &&rate : getrates())
2std::cout
<< rate << std::endl;34
for (auto &rate : rates)
5 rate *= 2;67
for (auto
const &rate : rates)
8std::cout
<< rate << std::endl;
1
for (auto &&[rate, flag] : getrates2())
2std::cout
<< rate << std::endl;
之前在 how to do it… 中顯示的基於範圍的 for 迴圈的表示式是基礎的語法糖,編譯器會將其轉換為其它的東西。在 c++17 之前,編譯器生成的**如下所示:
1
9}
**中的 begin_expr 和 end_expr 依賴於這個範圍的型別:
需要注意的是,如果乙個類包含名為 begin 或 end 的任何成員(函式,資料成員或列舉器),無論它們的型別和可訪問性,它們都將被選為 begin_expr 和 end_expr。因此,這樣的類型別不能使用基於範圍 for 迴圈。
在 c++17 中,編譯器生成的**略微不同:
1
10}
新標準移除了 begin 表示式和 end 表示式必須擁有同一型別的約束。end 表示式不再需要是乙個實際的迭代器,但是它必須能夠與迭代器進行不等式比較。
這樣做的好處是範圍可以由謂詞分隔。
- - - end - - -
基於範圍的for迴圈
1.範圍for的語法 在c 98中如果要遍歷乙個陣列,可以按照以下方式進行 void testfor for int i 0 i sizeof array sizeof array 0 i array i 2 for int p array p array sizeof array sizeof a...
基於範圍的for迴圈
在乙個範圍上執行for迴圈 用作對範圍中的各個值 如容器中的所有元素 進行操作的傳統for迴圈更加可讀的等價版本 屬性 可選 for 範圍宣告 範圍表示式 迴圈語句 上述語法產生的 等價於下列 range,begin和 end僅用域闡釋 對範圍表示式求值以確定要迭代的序列或範圍.依次對序列的每個元素...
基於範圍的迴圈
do.while 和 while 都不能進行基於範圍的迴圈,只能用for 語句。語法 for 元素名變數 廣義集合 元素名變數 可以是引用型別,以便直接修改集合元素的值,也可以是const型別,避免迴圈體修改元素的值 include include intmain 不能用 auto a std ar...