C++ 中的 Foreach 迴圈



Foreach 迴圈也稱為**基於範圍的**for 迴圈,它是一種以簡單易讀的方式迭代容器(如陣列、向量、列表)中元素的方法,無需執行任何額外的效能操作,例如初始化、增量/減量和迴圈終止或退出條件。

語法

以下是 foreach 迴圈的語法:

for( data_type  element_variable__name : container_name ){
   // code to be executed
}

這裡,

  • **element_variable_name** 是賦給儲存在容器中的元素的變數名。
  • **container_name** 是任何型別容器(例如陣列、向量、列表等)的變數名。

Foreach 迴圈的工作原理?

  • foreach 迴圈迭代給定容器的所有元素。該過程從第一個元素開始,該元素被賦值給變數,如程式碼中所示的 **element_variable_name**。
  • 然後,迴圈執行 foreach 迴圈的主體,允許您操作或使用這些元素。
  • 處理當前元素後,迴圈移動到容器中的下一個元素。
  • 此過程重複,直到到達容器的最後一個元素。

Foreach 迴圈示例

在這個例子中,基於範圍的 for 迴圈使用引用 (int& num) 允許您直接修改向量的每個元素。

#include <iostream>
#include <vector>
using namespace std;

int main() {
   vector<int> digits = {10, 20, 30, 40, 50};

   // Range-based for loop to modify each element
   for (int& num : digits) {
      num *= 2; // Double each number
   }

   for (int num : digits) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

輸出

20 40 60 80 100

使用向量的 Foreach 迴圈

foreach 迴圈可用於迭代向量元素。

示例

在這個例子中,我們使用 foreach 迴圈迭代並列印向量的元素。

#include <iostream>
#include <vector>
using namespace std;
int main() {
   vector<int> numbers = {1, 2, 3, 4};

   for (int num : numbers) {
      cout << num << " ";
   }
   return 0;
}

輸出

1 2 3 4 

使用列表的 Foreach 迴圈

類似地,foreach 迴圈也可用於迭代列表元素。

示例

在這個例子中,我們使用 foreach 迴圈迭代並列印列表的元素。

#include <iostream>
#include <list>

int main() {
   using namespace std;

   list<int> numbers = {10, 20, 30, 40, 50};

   for (int num : numbers) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

輸出

10 20 30 40 50 

For 迴圈與 Foreach 迴圈

for 迴圈根據給定條件執行語句集,而 foreach 迴圈(或基於範圍的 for 迴圈)迭代集合元素。考慮以下示例以瞭解 C++ 中 for 和 foreach 的區別:

標準方法:for 迴圈

以下是一個 for 迴圈的示例,我們在此列印整數陣列的元素:

#include<iostream>
using namespace std;

int main() {
   // an Array
   int arr[] = {1,2,3,4};

   // Printing array elements using
   // for loop
   for (int i = 0; i <= 3; i++) {
      cout << i<<" ";
   }
   return 0;
}

輸出

0 1 2 3

Foreach 迴圈方法

以下是一個 foreach 迴圈的示例,我們在此迭代並列印整數陣列的元素:

#include<iostream>
using namespace std;
int main() {
   int arr[] = {1,2,3,4};
   // Where x is variable name provided to 
   // elements inside container
   for(int x: arr) {    
      cout<< x<<" ";
   }
   return 0;
}

輸出

1 2 3 4

使用非容器型別的 Foreach 迴圈

通常,foreach 迴圈用於迭代陣列、向量、列表、雙端佇列、集合和對映等容器型別,但它也用於可迭代的非容器型別,這意味著它必須具有begin()end() 方法,返回迭代器。

像向量和上面提到的所有其他傳統容器都固有地滿足這些要求,因此我們不需要專門為其指定 begin() 和 end()。

示例

以下示例演示了 foreach 迴圈與非容器型別元素一起工作的過程:

#include <iostream>
#include <vector>
using namespace std;
class Iterable {
   public:
      // Constructor with initialization list
      Iterable(const vector<int>& v) : values(v) {}

      // Provide begin() and end() methods
      auto begin() const -> vector<int>::const_iterator {
         return values.begin();
      }
      auto end() const -> vector<int>::const_iterator {
         return values.end();
      }

   private:
      vector<int> values;
};

int main() {
   Iterable myIterable({1, 2, 3, 4, 5});

   for (int num : myIterable) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

輸出

1 2 3 4 5 

這裡,

  • 在上面的程式碼中,begin() 方法返回一個指向容器第一個元素的迭代器,而 end() 方法返回一個指向容器最後一個元素之後一個位置的迭代器。
  • 然後迴圈使用 for() 遍歷迭代器上的每個向量元素/值,並將每個值列印到控制檯。

Foreach 迴圈的優點

以下是 C++ 中使用 Foreach 迴圈的優點:

  • **簡潔性** - 它減少了樣板程式碼。
  • **可讀性** - 與舊的標準傳統迴圈方法(如 for、while 和 do-while 迴圈)相比,它以一種簡單易讀的方式編寫程式碼。
  • **安全性** - 它減少了與索引管理和極端情況相關的錯誤。

Foreach 迴圈的侷限性

以下是 foreach 迴圈的一些侷限性:

  • **僅限於正向遍歷** - 它無法訪問反向迭代。
  • **不可中斷遍歷** - 在到達最後一個索引或最後一個元素之前,沒有選項可以跳過任何元素或中斷迭代。
  • **迭代時無法直接訪問元素** - 在使用 foreach 迴圈迭代時,無法直接訪問當前元素的索引或位置。

Foreach 迴圈的應用

  • **只讀迭代** - 當用戶想要迭代元素而不進行任何修改時,foreach 迴圈是隻讀迭代的好選擇,因為它提供了更簡潔的程式碼。
  • **遍歷容器** - 當我們想要遍歷任何型別的容器(如陣列、列表、向量)時,foreach 迴圈非常有用,因為此迴圈簡化了遍歷容器元素的過程。
  • **簡單的修改** - 當我們想要執行任何簡單的操作時,它非常有用,因為它與舊的標準迭代程式碼編寫方法相比,它提供了更簡單、更容易和更易讀的程式碼。
  • **使用非容器型別** - 它也適用於滿足可迭代要求的任何型別,其中包括 begin() 和 end()。
廣告