Vector 迭代的一个问题:Expression: vector iterators incompatible
本帖最后由 leezjl 于 2013-09-10 13:41:41 编辑
for(vector<MemberFunc>::iterator vi = vec->begin(); vi != vec->end();)
{
MemberFunc mf = *vi;
mf.func = NULL;
mf.member = NULL;
CCLOG("vi: %d",vi);
vec->erase(vi++);
CCLOG("vi: %d",vi);
}
CCLOG是一个向控制台输出的语句
为什么在执行完vec->erase(vi++);后vi指向0了呢?导致运行出现vector iterators incompatible的问题。 迭代 iterator vector incompatible
[解决办法]
vector请使用vi = vec->erase(vi);的语法来进行删除
因为vector内部是连续内存实现的关系,删除一个元素会导致后面所有元素往前移动,实际上迭代器不需移动就已经指向原本的下一个元素,你再++就跳过了一个元素了
另外
MemberFunc mf = *vi;
mf.func = NULL;
mf.member = NULL;
这3句没有任何作用
先不说已经将要被删除的元素你去置个空有什么意义,MemberFunc mf = *vi;这句是将vi的元素拷贝了一个,根本没有修改vector内的元素啊
[解决办法]
c++98的标准中,关联容器的erase方法(参数为迭代器的版本)返回值是void,因此用的是迭代器++的技巧来得到下一个元素,而c++11标准中也修改为了返回指向下一个元素的迭代器
至于序列容器,原本就是返回下一个迭代器的,vector list deque都是
[解决办法]
楼主可以看下这篇文章:
http://blog.csdn.net/alex_my/article/details/8448779
[解决办法]
vec->erase(vi++); 不要这么写了 我当时就吃过它的大亏 而且erase的使用多少还是有几分蛋疼的