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 }
廣告