vector:erase用法,该怎么解决
vector::erase用法今天在网上看了这么一段有个vectorvectorAA vaa一个listlistint intList现在需要
vector::erase用法
今天在网上看了这么一段
有个vector
vector<AA> vaa;
一个list
list<int> intList;
现在需要执行这样的操作, 删除vaa里所有成员变量n在intList里的所有元素.那么, 应该怎么做呢?我们可以有下列选择:
1 手写循环
仿照list的删除方法.
C/C++ codevector<AA>::iterator ite = vaa.begin(); for (; ite != vaa.end(); ) { if (find(intList.begin(), intList.end(),ite->n) != intList.end()) vaa.erase(++ite); else ++ite; }
一运行就会发现不行了, vector的erase的特点是, 被删除的元素和之后的所有元素的iterator都失效了, 即使保存了后面一个iterator, 也不能继续遍历了
感觉好像是错的
C/C++ codevector<AA>::iterator ite = vaa.begin(); for (; ite != vaa.end(); ) { if (find(intList.begin(), intList.end(),ite->n) != intList.end()) ite = vaa.erase(ite); else ++ite; }
不就可以了么?
我写了一个代码试了一下,好像没啥问题。各位看法?
[解决办法]后置++法是对于关联式容器的删除元素有效;
对于vector、deque、string则使用 ite = vaa.erase(ite); 是正确的(用于标准序列式容器,不能用于关联式容器,因为关联式容器erase的返回值是void)。
[解决办法]vector用的是平摊法。添加或者删除元素时,都有可能新开一块空间,然后把现有空间里的元素整个复制过去,再释放现有空间。(理论上是这样子的,实际就得看代码怎么写的了)
不管前++,后++,重新分配后,原空间就不存在了,迭代器肯定失效。要用erase返回的才行
[解决办法]vector 的erase函数会是删除的迭代器后后续的迭代器都失效,而且由于vertor内部是连续的内存空间,删除元素后,会讲后边的元素往前移,所以楼主的第一种方法有问题,而且楼主的一个从算法本来就有问题,vaa.erase(++ite);是删除的是ite后边的一个元素
要达到功能可以用LZ的第二个方法,erase函数,返回的是删除元素的下一个位置的迭代器