关于stl标准容器中的迭代器的使用注意事项

来源:互联网 发布:中山大学网络不好 编辑:程序博客网 时间:2024/05/22 14:28

很多时候会这么写

std::map<int, T*> mMapItem;for( auto it = mMapItem.begin(); it != mMapItem.end(); ++it){//do something}
一般情况下不会出错

但是如果在循环里面对mMapItem做一些操作,比如删除的时候,++it的计算结果就会出错

因此如果在循环中有可能会做删除操作的时候这样写会比较好

for( auto it = mMapItem.begin(); it != mMapItem.end(); ){T* e = it->second;++it;//do something}


如果循环中会插入数据的也有可能会出问题,map不是vector,插入的数据很有可能在当前it之前,这个时候新加入的元素不会被遍历。

如果在it之后则会被遍历,因此结果是不确定的。因此这样的操作需要根据不同的容器做特殊处理。

总之就是对于容器的迭代器不能那么随意的使用,很有可能出现一些很难查明的bug

更正一下:

实际上stl容器提供的erase方法一般会返回一个iterator指向下一个节点,在删除的是后直接修正迭代器即可


0 0
原创粉丝点击