访问循环范围内的迭代器(c ++ 11)

时间:2013-12-14 16:19:33

标签: c++11 for-loop iterator

我可以使用for循环范围来访问实际的迭代器而不是容器的value_type吗?

我想要做的示例代码(不编译,因为x是对):

#include <iostream>
#include <map>

using namespace std;

std::map<int, float> v;

int main()
{
   for(auto x : v)    
       cout<<x->first<<", "<<x->second<<endl;
   return 0;
}

2 个答案:

答案 0 :(得分:3)

不,基于范围的for循环从迭代器中抽象出来。不过,在您的情况下,您只需将->更改为.

for(auto x : v)    
    cout<<x.first<<", "<<x.second<<endl;

存在基于范围的for循环,因此您不必处理迭代器。如果你确实需要迭代器,你必须手动编写循环,但实际代码不会那么长:

for (auto it = begin(v), ite = end(v); it != ite; ++it)
  //loop body

答案 1 :(得分:0)

是的,使用适当的容器适配器包装迭代器,使operator*()返回迭代器而不是值。

我认为提升带有这样的包装。

也许不是。但我确实在SO上找到了一个:https://stackoverflow.com/a/14920606/103167

事实上,正如Xeo观察到的那样,它可以用Boost完成,因为counting_range执行算术,它对迭代器起作用就像整数一样好:

for (auto it : boost::counting_range(v.begin(), v.end()))