自动const&map迭代器的类型是什么? C ++

时间:2018-08-28 11:49:01

标签: c++ c++11 dictionary iterator

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

我有以下结构的地图:

std::map< std::string, std::map<std::string, myClass*> > ComponentMap;

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

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
}

IsComponentOfType函数具有以下声明:

bool IsComponentOfType(const std::map<std::string, myClass* >::iterator & MapIter, const sCOMPONENT_TYPE & Type)

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

for (auto const& iter: ComponentMap[compNameString])

我收到以下编译错误:

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>>>> &'

为了“使” c ++ 11语法起作用,我需要重写哪种类型的函数参数?

3 个答案:

答案 0 :(得分:1)

使用

std::map< std::string, std::map<std::string, myClass*> > ComponentMap;

for (auto const& iter: ComponentMap[compNameString]) {}

iter的类型将被推论为std::map<std::string, myClass*>::value_type const&,等于std::pair<std::string const, myClass*> const&

使用range-based for loop获得的是 不是 迭代器,它是一个。每个值都对应于您循环经过的容器中的一个元素。

答案 1 :(得分:1)

C ++ 11 for循环在元素上循环。

备份并返回工作循环代码。然后在循环的顶部添加行auto const& elem=*iter;

接下来,逐行删除循环正文中的iter。更改每一行后,请确保代码可以编译并运行。

if (IsComponentOfType(iter, 

将此更改为

if (IsComponentOfType(elem, 

使用C ++ 03代码进行编译(将IsComponentOfType修改为std::pair<std::string const, myClass*> const&)。

iter->second

将此更改为

elem.second

完成此操作后(和其他地方类似),将循环更改为C ++ 11样式:

for (auto const& elem: ComponentMap[compNameString])

完成。

答案 2 :(得分:1)

Range-based for loop

  

attr(optional) for ( range_declaration : range_expression ) loop_statement

     

range_declaration-一个命名变量的声明,其类型是range_expression表示的序列元素的类型,或对该类型的引用。通常将自动说明符用于自动类型推导。

由于iter是一个值,
代替:

iter->second->GetComponentValue(date, compName, 00);

这应该有效:

iter.second->GetComponentValue(date, compName, 00);