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;
}
测试结果: