使用基於範圍的 for 迴圈迭代範圍

2022-09-17 05:57:09 字數 1794 閱讀 1621

許多程式語言支援 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...