[C++11] 遍历
C++原有的遍历方法往往通过迭代器
或者下标值,c++11
在循环遍历上有较多改进,首先是::for(auto& e: elem)::模式,较为接近python的for…in语句了。
for循环
#include
#include
#include
using namespace std;
int main(int argc, char const *argv[])
{
vector v = {0,1,2,3,4,5};
// i类型为int/auto都可以
for(const int& i: v)
cout << i << ' ';
cout << '\n';
for(auto i: v)
cout << i << ' ';
cout << '\n';
for(auto&& i: v)
cout << i << ' ';
cout << '\n';
// 右值引用改变元素的值
auto& cv = v;
for(auto&& i: cv)
i++;
// 1 2 3 4 5 6
for(const auto& i: cv)
cout << i << ' ';
cout << '\n';
// 遍历map
unordered_map map = {{1,4}, {2,5}, {3,6}};
for(auto v: map)
cout << v.first << ':' << v.second << ' ';
cout << '\n';
return 0;
}
for_each方法
标准库中增加了for_each方法,和std::begin, std::end
模板函数,对于可迭代对象可以用以下方式实现元素的遍历。该例子配合了匿名函数的使用。
vector l = {2,4,6,8};
for_each(std::begin(l), std::end(l), [](int p){cout << p << ' ';});
cout << '\n';
int l2[] = {1,3,5,7};
for_each(std::begin(l2), std::end(l2), [](int p){cout << p << ' ';});
cout << '\n';
构建自己能使用两种方法的类
class Container{
private:
int arr[5];
public:
Container():arr{1,2,3,4,5}
{
}
int* begin(){return arr;}
int* end(){return arr+sizeof(arr)/sizeof(int);}
};
int main(int argc, char const *argv[])
{
Container c;
//两种方法都可以用
for (auto &&i : c)
{
cout << i << ' ';
}
cout << '\n';
for_each(std::begin(c), std::end(c), [](int i){cout << i << ' ';});
cout << '\n';
}