C++ 11提供了一個特殊版本的 for 循環,在很多情況下,它都可以簡化數組的處理,這就是基於范圍的 for 循環。在使用基於范圍的 for 循環處理數組時,該循環可以自動為數組中的每個元素迭代一次。
例如,如果對一個 8 元素的數組使用基於范圍的 for 循環,則該循環將迭代 8 次。因為基於范圍的 for 循環可以自動知道數組中元素的個數,所以不必使用計數器變量控制其迭代,也不必擔心數組下標越界的問題。
基於范圍的 for 循環使用了一個稱為范圍變量的內置變量。每次基於范圍的 for 循環迭代時,它都會復制下一個數組元素到范圍變量。例如,第一次循環迭代,范圍變量將包含元素 0 的值;第二次循環迭代,范圍變量將包含元素 1 的值,以此類推。
以下是基於范圍的 for 循環的一般格式:
for (dataType rangeVariable : array)
statement;
現在來仔細看一看該格式的各個部分:
- dataType:是范圍變量的數據類型。它必須與數組元素的數據類型一樣,或者是數組元素可以自動轉換過來的類型。
- rangeVariable:是范圍變量的名稱。該變量將在循環迭代期間接收不同數組元素的值。在第一次循環迭代期間,它接收的是第一個元素的值;在第二次循環迭代期間,它接收的是第二個元素的值;以此類推。
- array:是要讓該循環進行處理的數組的名稱。該循環將對數組中的每個元素迭代一次。
- statement:是在每次循環迭代期間要執行的語句。要在循環中執行更多的語句,則可以使用一組大括號來包圍多個語句。
例如,假設已經定義了以下數組:
int numbers[] = {3, 6, 9};
可以使用基於范圍的 for 循環來顯示 numbers 數組的內容。語句如下:
for(int val : numbers) { cout << "The next value is "; cout << val << endl; }
因為 numbers 數組有 3 個元素,所以該循環將迭代 3 次。第一次它迭代時,val 變量將接收 numbers[0] 中的值;在第二次循環迭代期間,它將接收 numbers[1] 的值;在第三次循環迭代期間,它將接收 numbers[2] 的值。
所以,該代碼將產生以下輸出結果:
The next value is 3
The next value is 6
The next value is 9
如果需要的話,可以使用 auto 關鍵字指定范圍變量的數據類型,而不必手動指定,示例如下:
for (auto val : numbers) { cout << "The next value is "; cout << val << endl; }
下面的程序使用了基於范圍的 for 循環來顯示一個 string 變量的元素。
//This program demonstrates the range-based for loop #include <iostream> #include <string> using namespace std; int main () { string planets []= { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto(a dwarf planet)" }; // Display the values in the array cout << "Here are the planets: \n "; for (string val : planets) cout << val << endl; return 0; }
程序輸出結果為:
Here are the planets:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto(a dwarf planet)
使用基於范圍的 for 循環來修改數組
當基於范圍的 for 循環執行時,其范圍變量將僅包含一個數組元素的副本。因此,不能使用基於范圍的 for 循環來修改數組的內容,除非將范圍變量聲明為一個引用。引用變量是其他值的一個別名,任何對於引用變量的修改都將實際作用於別名所代表的值。
要將范圍變量聲明為引用變量,可以在循環頭的范圍變量名稱前面添加一個 &
符號。下面程序即顯示了這樣一個示例,它使用了基於范圍的 for 循環來將用戶輸入的數據存儲到一個數組中。
//This program uses a range-based for loop //to modify the contents of an array. #include <iostream> using namespace std; int main () { const int SIZE = 5; int numbers[SIZE]; //Get values for the array. for (int &val : numbers) { cout << "Enter an integer value: "; cin >> val; } // Display the values in the array. cout << "\nHere are the values you entered: \n"; for (int val : numbers) cout << val << " "; cout << endl; return 0; }
程序輸出結果:
Enter an integer value: 10
Enter an integer value: 20
Enter an integer value: 30
Enter an integer value: 40
Enter an integer value: 50
Here are the values you entered:
10 20 30 40 50
請注意范圍變量 val,在它的名稱前面有一個 &
符號,這表示它被聲明為引用變量。當循環執行時,val 變量將不再只是數組元素的副本,而是變成了元素本身的別名。因此,對 val 變量作出的任何修改都會實際作用於它當前引用的數組元素。
相比之下,第 20 行中的變量名前面就沒有 &
符號,這是因為在此無須將 val 聲明為引用變量。該循環只是要顯示數組元素,而不是改變它們。
基於范圍的 for 循環和常規 for 循環對比
基於范圍的 for 循環可用於需要遍歷數組所有元素的任何情形,並且不需要使用元素下標。但是,如果出於某些目的需要使用元素下標時,基於范圍的 for 循環就不能使用了。另外,如果循環控制變量被用於訪問兩個或兩個以上不同數組的元素,那么它也不適合使用。在這些情況下,可以使用常規 for 循環。
注意,引用范圍變量也可以使用 auto 關鍵字。例如,上面程序中的 for 循環也可以寫成如下的形式:
for (auto &val : numbers) { cout << "Enter an integer value: "; cin >> val; }