C++基於范圍的for循環詳解


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM