[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循环的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 中基于 For 循环的 C++17 广义范围