首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

<List> <vector> 删除操作,该如何处理

2014-01-09 
List vector 删除操作eg.for(itVec iVec.begin() itVec ! iVec.end() itVec++){if (!((*itVec)%2

<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();
}
}

在以上的两个容器里面删除的方式上list要重新定义迭代器,才能通过编译。请问:
(一)什么情况下迭代器会失效?
(二)vector的迭代器为什么不需要重新定义可以继续循环?

[解决办法]
vector 的是错的。
list 的效率低。
删除统一写成这样就行。

iterator = container.erase(iterator);

最好用 erase 配合 std::remove。
[解决办法]
引用:
Quote: 引用:

vector 的是错的。
list 的效率低。
删除统一写成这样就行。

iterator = container.erase(iterator);

最好用 erase 配合 std::remove。

vector我编译运行都没有出错,为什么是错的?我也查到了一个版本这是样
iList.erase(itList);
--itList;

是不是和
iterator = container.erase(iterator);

原理一样?返回迭代器前一个指针?

不一样。
vector::erase 会导致迭代器失效,对于一个无效迭代器使用 ++/-- 操作导致未定义行为。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

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
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

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 迭代器。


其实LZ的功能最好用STL的算法库中的remove_if完成
http://www.cplusplus.com/reference/algorithm/remove_if/
这里既有说明又有例子
[解决办法]
引用:
Quote: 引用:

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;
 }
}

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

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;
 }
}


木有错,考虑不周,所以直接用remove_if最方便,就算以后换了容器,照样能兼容
[解决办法]
for (iterator = begin; iterator != end;)
{
 if (*iterator to be removed)
 {
  iterator = container.erase(iterator);
 }
 else
 {
  ++iterator;
 }
}


++++++++1
[解决办法]

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;
}
}



删除元素后迭代器失效,要用迭代器变量保存erase的返回值,erase之后执行删除元素的下一个元素,迭代器不需要再++

热点排行