在c ++中使用基于for循环的范围时,如何告诉它使用哪个迭代器

时间:2014-09-12 18:40:22

标签: c++

我想知道哪个迭代器基于循环使用的范围,如std :: map;我假设它默认使用std :: map :: iterator而不是std :: map :: reverse_iterator。这是正确的,有没有一种方法可以告诉它实例化我更喜欢的迭代器,或者我只需要在那时使用传统的for循环?

for(const auto& keyValue:myMap)< ----这是否使用std :: map :: iterator,我可以使用std :: map :: reverse_iterator

4 个答案:

答案 0 :(得分:2)

根据C ++标准

  

- 如果_RangeT是类类型,则unqualified-ids的开头和结尾都是   在类_RangeT的范围内查找,就像通过类成员访问一样   查找(3.4.5),如果其中任何一个(或两个)找到至少一个   声明,beginexpr和end-expr是__range.begin()和   分别为__range.end();

因此,在您的情况下,会调用类begin()的成员函数end()std::map

我建议C + =标准委员会介绍一些内容

for ( auto x : reverse Container ) 
直到现在,我不知道我的建议结果,但据我所知,委员会正在调查这个问题。

至于你的情况,你可以使用一些包装器作为原始标准容器,它将定义成员函数的开始和结束,并将使用容器的反向迭代器。

答案 1 :(得分:1)

有一种方法可以反转迭代,如this answer中所述,但它使用了boost库。

虽然for ( const auto & keyValue : myMap )使用普通std::map::iterator

反向迭代的另一种方法是:

for (std::map::reverse_iterator iterator mymap.rbegin(); iterator != mymap.rend(); ++iterator)

c ++ 98(不仅是c ++ 11)接受了这一点。

答案 2 :(得分:1)

简而言之,基于范围的for规则如下:如果存在,则调用myMap.begin()myMap.end()。否则,它会调用begin(myMap)end(myMap)。是的,如果std::map使用std::map::iterator

如果您想要向后迭代,您可以自己编写适配器或使用boost::adaptors::reverse

另见:C++11 reverse range-based for-loop

更新:以下是基于范围的for§6.5.4)的完整规则,供参考:

  
      
  • 如果_RangeT是数组类型,则begin-exprend-expr分别为__range__range + __bound,其中__bound是数组绑定。如果_RangeT是未知大小的数组或不完整类型的数组,则该程序格式不正确;
  •   
  • 如果_RangeT是类类型,则在类_RangeT的范围内查找unqualified-ids的开始和结束,就像通过类成员访问查找(3.4.5)一样,如果是(或两者)分别找到至少一个声明,beginexprend-expr分别为__range.begin()__range.end();
  •   
  • 否则,begin-exprend-expr分别为begin(__range)end(__range),其中使用参数依赖查找(3.4.2)查找begin和end。出于此名称查找的目的,namespace std是一个关联的命名空间。
  •   

答案 3 :(得分:0)

range-based for loop使用正向迭代。如果你想向后迭代,那么你需要自己动手。