在C++11中,如何在范围for循环中访问迭代器?

4

我能否使用范围for循环来访问容器的迭代器而不是值类型?

以下是我想实现的示例代码(无法编译,因为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
简短回答:不行(除非容器中的项是迭代器,而你只想访问它们)。 - Jerry Coffin
顺便提一下,你可能想要通过const引用(const auto&)来获取x,而不是非const值(auto)。 - syam
谢谢大家 - 我只是想让例子简单些,我的情况比那个复杂一些。 - Babis
2个回答

2
不,基于范围的for循环抽象了迭代器。然而,在您的情况下,您只需要将->更改为.:
for(auto x : v)    
    cout<<x.first<<", "<<x.second<<endl;

范围-based for 循环存在的原因是为了让你不必处理迭代器。如果你确实需要迭代器,你就必须手动编写循环,但实际上代码并不会更长:

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

0

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

我认为boost带有这样的包装器。

也许没有。但我在SO上找到了一个:https://dev59.com/c2w05IYBdhLWcg3w6F8w#14920606

正如Xeo所观察到的那样,确实可以使用Boost来完成这个操作,因为counting_range执行算术运算,它可以像整数一样很好地处理迭代器:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接