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循环,提高编码效率以及代码可见性