读书人

地图遍历有关问题

发布时间: 2013-08-09 15:16:24 作者: rapoo

map遍历问题
有一个map对象xxx,现在对其进行遍历操作


map<int,int> xxx;
map<int,int>::iterator iter = xxx.begin();
for( ; iter != xxx.end();iter++)
{
Function(); // 这个函数可能会改变xxx比如对其使用插入操作,或者删除操作
// 如果改变了xxx会导致iter失效,从而导致运行崩溃,现在不改变Function函数
// 情况下,如何保证遍历正常的进行?
}


[解决办法]
如果你Function函数对xxx有插入删除操作的话,
xxx的迭代器就已经破坏无效啦!这个时候你又通过这个迭代器循环操作,
所以出问题是必然的啦


map<int,int>::iterator iter = xxx.begin();
for( ; iter != xxx.end();iter++)
{
Function(); // 这个函数可能会改变xxx比如对其使用插入操作,或者删除操作
// 如果改变了xxx会导致iter失效,从而导致运行崩溃,现在不改变Function函数
// 情况下,如何保证遍历正常的进行?
}

[解决办法]
要崩溃的话,那肯定是删除当前的iter对应的key了。只能改Function保证不删除当前iter。
[解决办法]
引用:
Quote: 引用:

如果你Function函数对xxx有插入删除操作的话,
xxx的迭代器就已经破坏无效啦!这个时候你又通过这个迭代器循环操作,
所以出问题是必然的啦


map<int,int>::iterator iter = xxx.begin();
for( ; iter != xxx.end();iter++)
{
Function(); // 这个函数可能会改变xxx比如对其使用插入操作,或者删除操作
// 如果改变了xxx会导致iter失效,从而导致运行崩溃,现在不改变Function函数
// 情况下,如何保证遍历正常的进行?
}

恩是的,但怎么改呢?


你在遍历的过程中,又有删除 插入的的东西, 这个遍历有什么作用呢?
达不到想要的效果吧?
[解决办法]
首先,我觉得你这个Function应该带iter参数的吧? (如果不带,忽略下面)
map的话应该不存在定点insert的吧(insert(iter, ...)这种)
所以,应该就是erase(iter)时爆了
这种的话,for改成:

while (xxx.end() != iter)
{
Function(iter++);
}

读书人网 >C++

热点推荐