表达式:map / set迭代器不可递增

时间:2012-08-07 12:34:54

标签: c++ map iterator

当programm执行此私有方法时

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;

我哪里错了? THX

P.S。哦,我发现在将地址保存到tr.nodes时我没有控制边界。 但这不是重点......

1 个答案:

答案 0 :(得分: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);

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