近来,基本上所有现代编程语言都有一种对一个区间写for循环的便捷方式。最终,C++也有了相同的概念;你可以给循环提供一个容器,它帮你迭代。
example:
#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷贝大的对象for(auto &it : num) {cout << ++it << endl;}// it 用于捕获vector里面的值for(auto it :num) {cout << it << endl;}map<int, int> num_map; num_map[2] = 4;num_map[4] = 5;num_map[6] = 1;for(auto it : num_map) { cout << it.first << endl<< ",second: " << it.second << endl;}
}
代码分析:
1
#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷贝大的对象for(auto it : num) {it++;}// it 用于捕获vector里面的值for(auto it :num) {cout << it << endl;}
}
结果
Build commands will be stored in build/compile_commands.json
'build' finished successfully (2.229s)
3
7
1
7
9
*原因: 迭代器没有取引用的操作,并没有修改原vector的值
#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷贝大的对象for(auto &it : num) {it++;}// it 用于捕获vector里面的值for(auto it :num) {cout << it << endl;}
}
Waf: Leaving directory `/home/antl417/AI_LB-files/Fattree_DiaoTest_Summary/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (2.246s)
4
8
2
8
10
2
#include <iostream>
#include <vector>
#include <map>
using namespace std;int main() {map<int, int> num_map; num_map[2] = 4;num_map[4] = 5;num_map[6] = 1;for (auto m = num_map.begin(); m != num_map.end(); ++m){m->second = 0.0;}for(auto it : num_map) { cout << it.first <<",second: " << it.second << endl;}
}
结果
2,second: 0
4,second: 0
6,second: 0
区间遍历的意义:
Strings,arrays,和所有的STL容器可以被新的区间迭代方式迭代。但是如果你想让你自己的数据结构使用这个新语法怎么办?
为了使这个数据结构可迭代,它必须类似于STL迭代器。
这个数据结构必须要有begin和end方法,成员方法和独立函数都行,这两个方法分别返回开始和结束的迭代器
迭代器支持操作符、!=操作符、++方法(前缀形式,成员函数和独立函数都行)
就这些!实现这五个函数,你就可以有一个支持区间迭代的数据结构。因为begin、end可以是非成员函数,你甚至可以适配现有数据结构而不用实现STL风格的迭代器。所有你要做的是创建你自己的支持、前缀++和!=的迭代器,并且定义好自己的begin、end。
另外,vector的几种遍历方式:
#include <vector>
#include <iostream>
#include <algorithm> // for_eachusing namespace std;struct Point
{double x;double y;Point(){x = 0;y = 0;}
};int main()
{vector<Point> m_testPoint;m_testPoint.clear();m_testPoint.shrink_to_fit();for (int i = 0; i<10; ++i){Point temp;temp.x = i*i;temp.y = i*i;m_testPoint.push_back(temp);}//第一种遍历方式,下标cout << "第一种遍历方式,下标访问" << endl;for (int i = 0; i<m_testPoint.size(); ++i){cout << m_testPoint[i].x << " " << m_testPoint[i].y << endl;}//第二种遍历方式,迭代器cout << "第二种遍历方式,迭代器访问" << endl;for (vector<Point>::iterator iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++){cout << (*iter).x << " " << (*iter).y << endl;}//第三种遍历方式,auto关键字cout << "C++11,第三种遍历方式,auto关键字" << endl;for (auto iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++){cout << (*iter).x << " " << (*iter).y << endl;}//第四种遍历方式,auto关键字的另一种方式cout << "C++11,第四种遍历方式,auto关键字" << endl;for (auto i : m_testPoint){cout << i.x << " " << i.y << endl;}// 第五种遍历方式,for_eachcout << "C++11,第五种遍历方式,for_each" << endl;for_each(m_testPoint.cbegin(), m_testPoint.cend(), [](const auto &val) -> void { cout << val.x << " " << val.y << endl; });return 0;