2012-08-07 67 views
1

当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中时我没有控制边界。 但这不是重点...

+0

你可以为函数或任何已定义的函数提供头文件 – Rolle 2012-08-07 12:53:03

+0

如果您认为自己可能在'tr.nodes'的末尾涂写,并且这是一个运行时错误,那么您可能会覆盖'mit'。你检查过了吗? – Chowlett 2012-08-07 12:54:21

+0

你实现内循环的方式意味着你从tr.nodes [1]开始为dit.begin() - > dwAddr;那是故意的吗? – Moritz 2012-08-07 13:47:24

回答

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

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

+0

'auto'是一个存储类说明符,不用于隐式地推断C++ 03或更低版本中的类型及其未标记的C++ 11。 – 2012-08-07 13:28:36

+0

...除[C++ 11]外(http://en.wikipedia.org/wiki/C%2B%2B0x#Type_inference) – Chowlett 2012-08-07 13:29:46

+0

未标记C++ 11。 – 2012-08-07 13:30:16