C++11的遍历

[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';
}

你可能感兴趣的:(C++11的遍历)