C++ 中基於範圍的 for 迴圈


基於範圍的 for 迴圈是在 C++ 11 標準中新增的,它是其傳統等效形式的更緊湊的形式。基於範圍的 for 迴圈用於迭代容器中的元素,從頭到尾。基於範圍的 for 迴圈的語法如下所示:

語法

for( range-declaration : range-expression ) loop statement

範圍宣告 - 它宣告一個變數,其型別與範圍表示式中元素的型別相同。通常使用 auto 關鍵字來自動識別範圍表示式中元素的型別。

範圍表示式 - 用於表示元素序列的任何表示式。也可以使用花括號中的元素序列。

迴圈語句 - for 迴圈的主體,包含一個或多個語句,這些語句將重複執行直到範圍表示式的末尾。

與傳統for 迴圈的比較 -

// Iterating over array
int arr[] = { 10,20,30,40,50 };
for (int num : arr)
printf("%d, ",num);
Is same as:
for ( int i=0;i<5;i++ )
printf("%d, ",arr[i]);

在這裡,人們可以很容易地看到,在基於範圍的 for 迴圈中不需要計算陣列的大小,因此不需要條件表示式。此外,不需要增量或減量操作。上面的基於範圍的 for 迴圈中的 num 在每次迭代中都從陣列 arr[] 中獲取從頭到尾的元素值。在執行跳轉語句之一之前,不會跳過任何元素。

break - 終止迴圈,對於所有剩餘的迭代。

continue - 跳過當前迭代並移動到下一個。

goto - 跳出迴圈到標籤後的語句 -

基於範圍的 for 迴圈的優點

  • 易於使用且語法簡單。

  • 無需計算容器中的元素數量或範圍表示式的尺寸。

  • 如果範圍宣告的資料型別未知,則可以在其位置使用 auto 說明符,這會使其自動與範圍表示式的型別相容。

  • 不需要條件語句或增量/減量語句。

  • 最適合一次迭代整個容器的情況。

基於範圍的 for 迴圈的缺點

  • 迭代 begin() 和 end() 之間的每個元素。無法處理特定的索引。

  • 使用基於範圍的 for 迴圈無法重新訪問一個或多個元素以及跳過一組元素。

  • 無法以相反的順序迭代陣列。為此,使用<boost/range/adaptor/reversed.hpp> 庫。

示例

 線上演示

#include <iostream>
#include <vector>
#include <map>
int main(){
   int arr[] = { 10,20,30,40,50 };
   // traditional for
   for ( int i=0;i<5;i++ )
      printf("%d, ",arr[i]);
      printf("\n");
   for (int num : arr)
      printf("%d, ",num);
      printf("\n");
   // for character array
      char str[] = "Hello World";
   for (char c : str)
      printf("%c ",c);
      printf("\n");
   for (char c : "Hello World")
      printf("%c ",c);
      printf("\n");
      std::map <int, char> MAP({{1, 'A'}, {2, 'B'}, {3, 'C'}});
   for (auto m : MAP)
      printf("{ %d, %c }", m.first,m.second);
}

輸出

10, 20, 30, 40, 50,
10, 20, 30, 40, 50,
H e l l o W o r l d
H e l l o W o r l d
{ 1, A }{ 2, B }{ 3, C }

更新於: 2020-07-28

4K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告