C++11新特性:基于范围的循环(foreach)

在C++中如何遍历数组(集合)中的每一个元素?对于这个问题,相信你第一反应想到的是 for 循环。

#include 
#include 

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 v = {4,3,2,1};

	set 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 
#include 

using namespace std;

void main()
{
	int a[] = {1,2,3,4,5};

	for (auto i : a)
	{
		cout << i << endl;
	}

	cout << endl;

	set 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 
#include 

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 
#include 

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

 

 

你可能感兴趣的:(#,C++11/14/17/20,C++11新特性,foreach)