【问题标题】:Iterate through a map of lists?遍历列表映射?
【发布时间】:2012-05-14 02:17:21
【问题描述】:

我有一个map<string, list<int> >,我想遍历列表并打印出每个数字。我不断收到关于 const_iterator 和迭代器之间转换的编译错误。我做错了什么?

for (map<string, list<int> >::iterator it = words.begin(); it != words.end(); it++)
{
   cout << it->first << ":";
   for (list<int>::iterator lit = it->second.begin(); lit  != it->second.end(); lit++)
      cout << " " << intToStr(*lit);
   cout << "\n";
}

error: conversion from
  ‘std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::list<int, std::allocator<int> > > >’
to non-scalar type
  ‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::list<int, std::allocator<int> > > >’
requested|

【问题讨论】:

  • 您的words 地图是否有可能是const
  • 是的,我不明白它是 const,因为我没有在受保护的部分将它定义为 const。它变成了 const 与类中的函数(即 const)完全忘记了它是一个 const 函数。

标签: c++ list map iterator auto


【解决方案1】:
map<string, list<int> >::iterator

应该是

map<string, list<int> >::const_iterator

您的mapconst,或者您的地图是class 的成员,并且您在const 函数中调用此代码,这也使您的map const。无论哪种方式,您都不能在 const 容器上使用非 const 运算符。

编辑:我是唯一一个喜欢使用显式类型而不是 auto 的人吗?

【讨论】:

  • 谢谢,解决了这个问题,编译并得到了与列表类似的东西,并添加了 const_iterator,现在它可以工作了。我不知道 const_iterator。
【解决方案2】:

尝试使用新的 C++11 auto 关键字

for (auto it = words.begin(); it != words.end(); it++)
{
   cout << it->first << ":";
   for (auto lit = it->second.begin(); lit  != it->second.end(); lit++)
      cout << " " << intToStr(*lit);
   cout << "\n";
}

如果你仍然得到错误,你定义了不一致的类型。

【讨论】:

  • 有趣的是,我以前从未听说过或读过汽车。需要阅读并学习。谢谢。
  • @LF4 如果你使用 Visual C++ 2010 或更高版本,或者 gcc 4.4 或更高版本,它应该可以编译。
  • 我使用的是 gcc 4.4.6,有什么推荐的网站可以阅读关于 auto 的内容吗?我试图在 cplusplus.com 上找到它,但它提取了每个类的很多功能(如果他们实现了它就有意义)。
【解决方案3】:

尝试使用新的 C++11 range-based for loop:

for(auto& pair : words) {
  std::cout << pair.first << ":";
  for(auto& i : pair.second) {
    std::cout << " " << intToStr(i);
  }
  std::cout << "\n";
}

【讨论】:

  • 上帝这么干净……不过我已经十多年没用过 C++了,auto &amp; 是怎么回事?我认为auto 将完整类型推导出为参考。
  • auto i 创建一个本地初始化为范围内项目的值。 auto&amp; i 创建一个绑定到范围内项目的引用。如果你想避免复制,或者你想修改项目,你必须做auto&amp;
  • 嗯,我明白了。我猜 C# 的 var 关键字相当于 auto &amp; 然后。
  • 哇,C++ 中的 foreach 很棒。我尝试实现它,但得到了错误,“预期在‘:’令牌之前初始化”。这是在类函数中实现的,并且 words 是一个受保护的映射,而不是函数本身,如果这很重要的话。
  • @LF4 - 你提到你使用 g++4.4.6。看起来你的 g++ 对于这个功能来说太旧了。它符合 C++11 标准,was implemented in G++ 4.6
猜你喜欢
  • 2022-01-19
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多