【问题标题】:Expression:map/set iterator not incrementable表达式:map/set 迭代器不可递增
【发布时间】:2012-08-07 12:34:53
【问题描述】:

当程序执行这个私有方法时

map<char*, vector<MAILPACK>>::iterator mit;
vector<MAILPACK>::iterator dit;
for(mit=funcs.begin(); mit!=funcs.end(); mit++) {
    TRACE tr;
    tr.crc32 = crc32;
    strncpy(tr.name, (*mit).first, sizeof(tr.name));
    int i = 0;
    for(dit=(*mit).second.begin(); dit!=(*mit).second.end(); dit++){
        tr.nodes[i++] = dit->dwAddr;
    }       
}   

我收到如下错误:Expression:map/set iterator not incrementable

这个函数遍历私有映射std::map&lt;char*, std::vector&lt;MAILPACK&gt;&gt; funcs;

我哪里错了? 谢谢

附:哦,我发现保存地址到tr.nodes时没有控制边界。 但这不是重点……

【问题讨论】:

  • 你能提供函数的头文件或任何定义的函数吗
  • 如果您认为您可能在tr.nodes 的末尾乱涂乱画,这是一个运行时错误,那么您可能正在覆盖mit。你检查了吗?
  • 你实现内部 for 循环的方式意味着你从 tr.nodes[1] 开始 for dit.begin()->dwAddr;这是故意的吗?
  • @Moritz - 不,这是一个后增量;递增并返回旧值(或者,从概念上讲,使用旧值然后递增)

标签: c++ map iterator


【解决方案1】:

一些typedef 不会误入歧途。并且预增量你的迭代器,避免无用的迭代器对象副本。

typedef vector<MAILPACK> Mailpacks;
typedef map<char*, Mailpacks> MailpackMap;

for(MailpackMap::iterator mit=funcs.begin(); mit!=funcs.end(); ++mit) 
{
  TRACE tr;
  tr.crc32 = crc32;
  strncpy(tr.name, (*mit).first, sizeof(tr.name));
  int i = 0;
  Mailpacks& mail = (*mit).second;
  for(Mailpacks::iterator dit= mail.begin(); dit!=mail.end(); ++dit)
  {
    tr.nodes[i++] = dit->dwAddr;
  }       
}

我同意@Chowlett 的观点,并认为您正在超越您的tr.nodes 界限并超越您的一个迭代器。由于您在循环期间实例化了 TRACE 对象,因此很有可能发生这种情况。当您的迭代器已失效时,您通常会收到Expression:map/set iterator not incrementable 错误。

你是tr.nodes的成员有什么理由也不能是向量吗?

tr.nodes.push_back(dit->dwAddr);

我可能是错的,更多信息总是有帮助的。

【讨论】:

  • auto 是一个存储类说明符,不能用于隐式推断 C++03 或更低版本中的类型,并且未标记 C++11。
  • 虽然如此,但我们不知道他不能使用 C++11。这不像是一种全新的语言。直到最近,我才知道我的编译器支持一堆(而不是全部!)C++11 特性。
  • 好的,我为此道歉。我会修改的。
  • @Chowlett 现在很多人都做出了启用 C++11 的简单假设。它使示例更易于编写并向初学者展示 The Way (tm)。只要代码易于移植回来,就不会造成任何伤害。当然,不应广泛使用更具侵入性的功能。
猜你喜欢
  • 2013-06-17
  • 1970-01-01
  • 2010-09-16
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多