首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

地图遍历有关问题

2013-08-09 
map遍历问题有一个map对象xxx,现在对其进行遍历操作mapint,int xxxmapint,int::iterator iter xxx.

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

热点排行