auto const & map 迭代器的类型是什么?由 小码哥发布于

And*_* V. 5 c++ dictionary iterator c++11

我需要修复我的一个旧项目的一些错误,我认为这是重构一些代码的最佳时机。

我有以下结构的地图:

std::map< std::string, std::map<std::string, myClass*> > ComponentMap;
Run Code Online (Sandbox Code Playgroud)

在某个地方,我需要迭代一些底层子地图,我使用了以下内容:

for (std::map<std::string, myClass* >::iterator iter = ComponentMap[compNameString].begin(); iter != ComponentMap[compNameString].end(); ++iter)
{
 //some code
 if (IsComponentOfType(iter, sCOMP_PRINCIPAL))
     iter->second->GetComponentValue(date, compName, 00);
 //some more code
}
Run Code Online (Sandbox Code Playgroud)

IsComponentOfType 函数具有以下声明:

bool IsComponentOfType(const std::map<std::string, myClass* >::iterator & MapIter, const sCOMPONENT_TYPE & Type)
Run Code Online (Sandbox Code Playgroud)

我的问题是:当我这样重写 for 循环时:

for (auto const& iter: ComponentMap[compNameString])
Run Code Online (Sandbox Code Playgroud)

我收到以下编译错误:

IsComponentOfType(const std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> &,const sCOMPONENT_TYPE &)': cannot convert argument 1 from 'const std::pair<const _Kty,_Ty>' to 'const std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> &'
Run Code Online (Sandbox Code Playgroud)

我需要重写函数的第一个参数是什么类型才能“使”c++11 语法工作?

Som*_*ude 3

和

std::map< std::string, std::map<std::string, myClass*> > ComponentMap;
Run Code Online (Sandbox Code Playgroud)

和

for (auto const& iter: ComponentMap[compNameString]) {}
Run Code Online (Sandbox Code Playgroud)

的类型iter实际上会被推导为std::map<std::string, myClass*>::value_type const&,它等于std::pair<std::string const, myClass*> const&。

使用基于范围的for循环得到的不是迭代器,而是值或对值的引用。每个值对应于您循环的容器中的一个元素。

  • 在这种情况下,它不是一个值,而是对值的“const”引用。 (2认同)