1

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

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<char*, std::vector<MAILPACK>> funcs;

我哪里错了?谢谢

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

4

1 回答 1

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);

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

于 2012-08-07T13:07:34.817 回答