<List> <vector> 删除操作
eg.
for(itVec = iVec.begin(); itVec != iVec.end(); itVec++)
{
if (!((*itVec)%2))
{
iVec.erase(itVec);
}
}
for (itLst = iLst.begin(); itLst != iLst.end(); itLst++)
{
if((*itLst)%2)
{
iLst.erase(itLst);
itLst = iLst.begin();
}
}
iterator = container.erase(iterator);
vector 的是错的。
list 的效率低。
删除统一写成这样就行。
iterator = container.erase(iterator);
最好用 erase 配合 std::remove。
vector我编译运行都没有出错,为什么是错的?我也查到了一个版本这是样iList.erase(itList);
--itList;
是不是和iterator = container.erase(iterator);
原理一样?返回迭代器前一个指针?
不一样。
vector::erase 会导致迭代器失效,对于一个无效迭代器使用 ++/-- 操作导致未定义行为。
那请问既然已经失效,执行iterator = container.erase(iterator);操作后,迭代器是指向哪里了?
vector 的是错的。
list 的效率低。
删除统一写成这样就行。
iterator = container.erase(iterator);
最好用 erase 配合 std::remove。
iterator = container.erase(iterator);
--iterator;
vector 的是错的。
list 的效率低。
删除统一写成这样就行。
iterator = container.erase(iterator);
最好用 erase 配合 std::remove。
vector我编译运行都没有出错,为什么是错的?我也查到了一个版本这是样iList.erase(itList);
--itList;
是不是和iterator = container.erase(iterator);
原理一样?返回迭代器前一个指针?
不一样。
vector::erase 会导致迭代器失效,对于一个无效迭代器使用 ++/-- 操作导致未定义行为。
那请问既然已经失效,执行iterator = container.erase(iterator);操作后,迭代器是指向哪里了?
指向被删除元素的下一个元素,如果没有下一个了,则等于 end 迭代器。
vector 的是错的。
list 的效率低。
删除统一写成这样就行。
iterator = container.erase(iterator);
最好用 erase 配合 std::remove。
iterator = container.erase(iterator);
--iterator;
for循环里删除应该这样。erase(iter)后iter失效,但是erase会返回一个有效的iter,它指向最后一个被删除元素的后继(erase支持删除指定范围的迭代器),所以这里要用iter保存erase的返回值。但是在for的循环提结束时,会自动执行++iter,导致erase返回的迭代器压根没被循环访问,所以我们需要人为地--iter
for (iterator = begin; iterator != end;)
{
if (*iterator to be removed)
{
iterator = container.erase(iterator);
}
else
{
++iterator;
}
}
vector 的是错的。
list 的效率低。
删除统一写成这样就行。
iterator = container.erase(iterator);
最好用 erase 配合 std::remove。
iterator = container.erase(iterator);
--iterator;
for循环里删除应该这样。erase(iter)后iter失效,但是erase会返回一个有效的iter,它指向最后一个被删除元素的后继(erase支持删除指定范围的迭代器),所以这里要用iter保存erase的返回值。但是在for的循环提结束时,会自动执行++iter,导致erase返回的迭代器压根没被循环访问,所以我们需要人为地--iter
这种方法不正确,如果删除的是第一个元素,erase 返回的迭代器是 begin,使用 --iterator 会导致未定义行为。
楼主用下面这样的吧。
for (iterator = begin; iterator != end;)
{
if (*iterator to be removed)
{
iterator = container.erase(iterator);
}
else
{
++iterator;
}
}
for (iterator = begin; iterator != end;)
{
if (*iterator to be removed)
{
iterator = container.erase(iterator);
}
else
{
++iterator;
}
}
std::list<int>::iterator it = lists.begin();
while(it != lists.end())
{
if((*it)%2)
{
it = lists.erase(it);
}
else
{
++it;
}
}
std::vector<int>::iterator pos = vecs.begin();
while(pos != vecs.end())
{
if((*pos)%2)
{
pos = vecs.erase(pos);
}
else
{
++pos;
}
}