vector和map的erase问题

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)不会!切记!!

 

发布了33 篇原创文章 · 获赞 4 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章