[C++11]基于范围的for循环

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++11]基于范围的for循环相关的知识,希望对你有一定的参考价值。

C++11提供了一种新型的for循环形式 - 基于范围的for循环

语法:

for (declaration : expression)
{
	//循环体
}

在上面的语法格式中,declaration表示遍历声明,在遍历过程中,当前被遍历到的元素会被存储到声明的变量中,expression是要遍历的对象,它可以是表达式,容器,数组,初始化列表等。

代码如下:

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


int main()
{

	vector<int> v{ 1,2,3,4,5,6,7,8,9 };

	for (auto it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;


	for (auto &item : v)//在这里使用了引用,这样就不会拷贝,效率更高,还能修改元素的值
	{
		cout << item++ << " ";
	}
	cout << endl;

	for (auto &item : v)
	{
		cout << item << " ";
	}
	cout << endl;

	for (const auto &item : v)//既提高效率,也不修改值
	{
		cout << item << " ";
	}
	cout << endl;

	return 0;
}

测试结果:
在这里插入图片描述

基于范围的for循环需要注意的3个细节:

1.关系型容器

代码如下:

#include<iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
	map<int, string> mp{ {12, "Tom"}, { 13,"jack" }, { 33,"mike" }};
	for (const auto & item : mp)
	{
		cout << item.first << " " << item.second << endl;
	}

	cout << "-----------------------" << endl;
	for (auto it = mp.begin(); it != mp.end(); it++)
	{
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}

在这里插入图片描述

在上面的例子中使用了两种方法对map容器进行遍历,通过对比,有两点需要注意:

测试结果:
在这里插入图片描述

2.元素只读

在这里插入图片描述

代码如下:

#include <iostream>
#include <set>

using namespace std;

int main()
{
	set<int>st{ 1,2,3,4,5,6 };
	for (auto &item : st)
	{
		cout << item++ << endl;//error,不能给常量赋值
	}
	return 0;
}

在这里插入图片描述

代码如下:

#include <iostream>
#include<map>
#include <string>

using namespace std;

int main()
{
	map<int, string>m{ {12,"Tom"},{14,"jack"},{19,"bom"} };
	for (auto & item : m)
	{
		cout << item.first++ << " " << item.second << endl;//error
	}
	return 0;
}

3.访问次数

在这里插入图片描述

代码如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;


vector<int>v{ 1,2,3,4,5,6 };

vector<int>& getRange()
{
	cout << "get vector range ..." << endl;
	return v;
}


int main()
{
	for (auto val : getRange())
	{
		cout << val << " ";
	}
	cout << endl;

	return 0;
}

测试结果:

在这里插入图片描述

以上是关于[C++11]基于范围的for循环的主要内容,如果未能解决你的问题,请参考以下文章

C++11 基于范围的for循环

Visual Studio 中基于 For 循环的 C++17 广义范围

在 Qt 中正确使用 C++11 基于范围的 for 循环

[C++11]基于范围的for循环

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围

如何让 C++0x / C++11 风格的基于范围的 for 循环与 clang 一起使用?