我想知道哪个迭代器基于循环使用的范围,如std :: map;我假设它默认使用std :: map :: iterator而不是std :: map :: reverse_iterator。这是正确的,有没有一种方法可以告诉它实例化我更喜欢的迭代器,或者我只需要在那时使用传统的for循环?
for(const auto& keyValue:myMap)< ----这是否使用std :: map :: iterator,我可以使用std :: map :: reverse_iterator
答案 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-expr
和end-expr
分别为__range
和__range + __bound
,其中__bound
是数组绑定。如果_RangeT
是未知大小的数组或不完整类型的数组,则该程序格式不正确;- 如果
_RangeT
是类类型,则在类_RangeT
的范围内查找unqualified-ids的开始和结束,就像通过类成员访问查找(3.4.5)一样,如果是(或两者)分别找到至少一个声明,beginexpr
和end-expr
分别为__range.begin()
和__range.end()
;- 否则,
begin-expr
和end-expr
分别为begin(__range)
和end(__range)
,其中使用参数依赖查找(3.4.2)查找begin和end。出于此名称查找的目的,namespace std是一个关联的命名空间。
答案 3 :(得分:0)
是range-based for
loop使用正向迭代。如果你想向后迭代,那么你需要自己动手。