vector和map的erase问题
2010-08-16 23:08
323 查看
STL map的不经意的小问题
这是工作中遇到的一个问题,由于对map理解的不深刻,导致bus error。乍一看,程序似乎没有问题,我们的for 循环一直是这么写的,但是仔细分析一下map删除的机制:原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用,否则会导致程序无定义的行为。这里it已经删除,已经是个野指针,不能再用it++。
正确的操作是mymap.erase(it++);
mymap中在删除it的时候,先将it做缓存,然后执行it++使之指向下一个结点,再进入erase函数体中执行删除操作,删除时使用的it就是缓存下来的it(也就是当前it(做了加操作之后的it)所指向结点的上一个结点)。
当然vector不存在这种问题,但是看下面一个小程序:
这段代码将会显示如下输出:
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
GHIJ
HIJ
IJ
J
如果for( int i=0; i < size; i++ )
改成for( it=alphaVector.begin(); it!= alphaVector.end(); it++ )
那得到的结果是
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
这表明vector size是动态更新的。而且vector.erase(it) it指向删除的最后一个元素的下一位置的迭代器,而map.erase(it)不会!切记!!
// erasing from map #include <iostream> #include <map> #include <iterator> using namespace std; int main () { map<char,int> mymap; map<char,int>::iterator it; // insert some values: mymap['a']=10; mymap['b']=20; mymap['c']=30; mymap['d']=30; mymap['e']=10; mymap['f']=10; // show content: for ( it=mymap.begin() ; it != mymap.end(); it++) { cout << (*it).first << " => " << (*it).second << endl; mymap.erase(it); } system("pause"); return 0; }
这是工作中遇到的一个问题,由于对map理解的不深刻,导致bus error。乍一看,程序似乎没有问题,我们的for 循环一直是这么写的,但是仔细分析一下map删除的机制:原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用,否则会导致程序无定义的行为。这里it已经删除,已经是个野指针,不能再用it++。
正确的操作是mymap.erase(it++);
mymap中在删除it的时候,先将it做缓存,然后执行it++使之指向下一个结点,再进入erase函数体中执行删除操作,删除时使用的it就是缓存下来的it(也就是当前it(做了加操作之后的it)所指向结点的上一个结点)。
当然vector不存在这种问题,但是看下面一个小程序:
vector<char> alphaVector; for( int i=0; i < 10; i++ ) alphaVector.push_back( i + 65 ); int size = alphaVector.size(); vector<char>::iterator startIterator; vector<char>::iterator tempIterator; for( int i=0; i < size; i++ ) { startIterator = alphaVector.begin(); alphaVector.erase( startIterator ); // Display the vector for( tempIterator = alphaVector.begin(); tempIterator != alphaVector.end(); tempIterator++ ) cout << *tempIterator; cout << endl; }
这段代码将会显示如下输出:
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
GHIJ
HIJ
IJ
J
如果for( int i=0; i < size; i++ )
改成for( it=alphaVector.begin(); it!= alphaVector.end(); it++ )
那得到的结果是
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
这表明vector size是动态更新的。而且vector.erase(it) it指向删除的最后一个元素的下一位置的迭代器,而map.erase(it)不会!切记!!
相关文章推荐
- vector和map的erase问题
- C++STL中对vector进行erase删除元素操作中遇到的问题。
- 聊聊map和vector的迭代器失效问题(某公司招聘笔试试题)
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- vector和map的erase()函数
- C++技术问题总结map、vector、list、deque各自的使用场合
- vector的erase问题
- std::vector的erase的问题
- 《游戏编程入门》源代码子画面销毁bug与vector容器vector::erase的问题
- vector::erase()方法的详细介绍及问题解答 (2010-04-20 09:09:11) http://bbs.csdn.net/topics/390902650?page=1
- 关于vector的erase问题处理
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- map等关联容器 vector等序列容器 如何防止迭代器失效 即erase()的使用
- vector与map的erase()函数详细解析
- vector和map的erase()函数
- map和vector的迭代器失效问题(某公司招聘笔试试题)
- vector::erase()方法的详细介绍及问题解答
- 记录一下结构体排序的问题(vector,map)
- C++技术问题总结-第7篇 map、vector、list、deque各自的使用场合
- C++/STL用erase删除元素(vector,deque),(list,set,map)