C++11新特性-for+auto构成的foreach

737 阅读2分钟

C++11中引入了auto关键字来做类型推导,特别是放在for循环中,增加了编码效率

std::vector<int> vec={1,2,3,4,5,6};  //该初始化列表也是C++11新特性 

我们先给出三种基本的变形

(1)我们想要遍历该vector数组,而并不改变数组元素会使用如下

        for(auto p:vec)
        {
                cout<<p<<" ";
        }

或者是

        for(const auto p:vec)
        {
                cout<<p<<" ";
        }

(2)如是你想改变元素,你讲使用下面的for循环

       for(auto &p:vec)
        {
                p=p*2;
        }

你可能问上面的for循环有啥用呢?有,主要在与它可以减少我们对于带有迭代器的容器的遍历

比如底层是红黑树的std::map,我们原来要遍历map都是如下方式

        for(std::map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
        {
                cout<<it->first<<" "<<it->second<<endl;
        }

咱们使用c++11的foreach语法

       for(auto it:mp)
        {
                cout<<it.first<<" "<<it.second<<endl;
        }

你看:同样的功能,代码简洁了很多,代码可见性也变好了。

另外给大家介绍一个STL中的一个封装的for-loop:std::foreach详细资料见

zh.cppreference.com/w/cpp/algor…

下面简要说一下用法:

     (1)  for_each(vec.begin(),vec.end(),[&](int &p){p+=1;});
     (2) for_each(vec.begin(),vec.end(),[](int p){cout<<p<<endl;});

(1)表示遍历vec中每个元素,并让vec每个元素加一;

(2)表示遍历vec中每个元素,并打印其值

参考代码: 编译选项g++ for.cpp -std=c++11

//for.cpp
#include<iostream>
#include<vector>
#include<map>
using namespace std;

int main(){
        vector<int> vec={1,2,3,4,5};


        for(auto p:vec)
        {
                cout<<p<<" ";
                p=p+1;
        }

        cout<<endl;
        for(const auto p:vec)
        {
                cout<<p<<" ";
        }

        cout<<endl;
        for(auto &p:vec)
        {
                p=p*2;
        }

        cout<<endl;
        for(auto p:vec)
        {
                cout<<p<<" ";
        }

        cout<<endl;
        std::map<int,int> mp={{1,2},{2,3},{4,5}};
        for(std::map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
        {
                cout<<it->first<<" "<<it->second<<endl;
        }

        for(auto it:mp)
        {
                cout<<it.first<<" "<<it.second<<endl;
        }

        for_each(vec.begin(),vec.end(),[](int &p){p+=1;});
        for_each(vec.begin(),vec.end(),[](int p){cout<<p<<endl;});


}

我们最后总结一下foreach语法的作用:

             简化for循环,提高编码效率以及代码可见性