在C++中如何周遊數組(集合)中的每一個元素?對于這個問題,相信你第一反應想到的是 for 循環。
#include <iostream>
#include <set>
using namespace std;
void main()
{
int a[] = {1,2,3,4,5};
for (int i = 0; i < sizeof(a) / sizeof(*a); i++)
{
cout << a[i] << endl;
}
cout << endl;
//set<int> v = {4,3,2,1};
set<int> v = { 0,1,2,3,4,5};
for (auto it = v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
cin.get();
}
在上面的示例中,通過 for 循環周遊數組(集合)中的每一個元素,并列印其值。這對于熟悉 C++ 的程式員來說是非常容易的一件事;不過,無論是周遊基本類型數組還是周遊集合類型對象,都需要指明循環的界限,否則就可能産生越界錯誤。
那麼,是否可以讓 for 循環自動确定循環範圍呢?
C++11中引入了 foreach 循環的語言特性(自動确定循環範圍),使用這個特性能夠非常友善快捷的對數組(集合)中的元素進行周遊,而不必再關心和計算數組(集合)的界限。
#include <iostream>
#include <set>
using namespace std;
void main()
{
int a[] = {1,2,3,4,5};
for (auto i : a)
{
cout << i << endl;
}
cout << endl;
set<int> v = {4,3,2,1,0,8,5};
for (auto i : v) //從小到大進行排序,然後才輸出,并且裡面沒有重複的元素,如果有重複的元素,則會剔除
{
cout << i << endl;
}
cin.get();
}
上面的示例通過一個基于範圍的 for 循環周遊數組和集合; for 循環後的括号由冒号 “:” 分為兩個部分:第一個部分用于表示循環的疊代變量,即目前變量的值;第二個部分用于表示被通路的(數組)集合。另外,第一個部分中的疊代變量 i 使用 auto關鍵字進行聲明,這意味着由編譯器自動确認 i 的具體類型;而 i 的具體類型完全取決于第二個部分的 a 和 v。當然,在實際開發時,也可以不使用關鍵字 auto 而具體指明疊代變量的資料類型。
示例:
#include <iostream>
#include <set>
using namespace std;
void main()
{
int a[] = {1,2,3,4,5};
for (int& i : a)
{
i *= 2;
}
for (int i : a)
{
cout << i << endl;
}
cin.get();
}
上面示例中第一個 for 循環的疊代變量采用了引用的形式;是以,當疊代變量在循環中被改變時,這個改變将反映到具體的數組(集合)元素。
基于範圍的 for 循環依然支援 continue 和 break;使用 continue 結束目前循環,并立即進入下一次循環;使用 break 跳出整個 for 循環。
注意:如果數組(集合)的大小(範圍)在編譯期間不能确定,那麼不能夠使用基于範圍的 for 循環。
#include <iostream>
#include <set>
using namespace std;
void func(int a[3])
{
for (auto i : a)
{
cout << i << endl;
}
}
void main()
{
int a[] = {1,2,3,4};
func(a);
cin.get();
}