基於范圍的for循環是一種可以針對數組中每個元素迭代一次的循環。每次進行該循環迭代時,就會將一個元素從數組復制帶變量。基於范圍的for循環是C++ 11中的新功能。
C++ 11提供了一個特殊版本的for循環,在很多情況下,它都可以簡化數組的處理,這就是基於范圍的for循環(Rang-Based for Loop)。在使用基於范圍的for循環處理數組時,該循環可以自動為數組中的每個元素迭代一次。例如,如果對一個8元素的數組使用基於范圍的for循環,則該循環將迭代8次。因為基於范圍的for循環可以自動知道數組中的個數,所以不必使用計數器變量控制其迭代,也不必擔心數組下標越界的問題。
基於范圍的for循環使用了一個稱為范圍變量(Range Variable)。每次基於范圍的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 << endll;
}
因為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 << endll;
}
使用基於范圍的for循環來顯示一個string變量的元素。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string planets[] = {"Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus",
"Neptune", "Pluto(a dwarf planet)"};
cout<<"Here are the planets: \n";
for(string val : planets)
cout << val <<endl;
return 0;
}
結果:

使用基於范圍的dor循環來修改數組
當基於范圍的for循環執行時,其范圍變量將僅包含一個數組元素的副本。因此,不能使用基於范圍的for循環來修改數組的內容,除非將范圍變量聲明為一個引用。
要將范圍變量聲明為引用變量,可以在循環頭的范圍變量名稱添加一個&符號。以下代碼即顯示了這樣一個示例,它使用了基於for循環來將用戶輸入的數據存儲到一個數組中。
#include <iostream>
#include <string>
using namespace std;
int main()
{
const int SIZE = 5;
int numbers[SIZE];
//Get values for the array
for(auto &val : numbers)
{
cout << "Enter an integer value: ";
cin >> val;
}
//Display the values in the array
cout << "\nHere are the values you entered:\n";
for(auto val :numbers)
cout << val << " ";
cout << endl;
return 0;
}
結果:

基於范圍的for循環和常規for循環對比
基於范圍的for循環可用於需要遍歷數組所有元素的任何情形,並且不需要使用元素下標。但是,如果出於某些目的需要使用元素小標時,基於范圍的for循環就不能使用了。另外,如果循環控制變量被用於訪問兩個或兩個以上不同數組的元素,那么它也不適合使用。在這種情況下,可以使用常規for循環。
注意:引用范圍變量也可以使用auto關鍵字。如上示例所示。
