怎么解决std vector erase容器erase崩溃

vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。
erase–return value
首先需要明确一下vector的两种erase:
C++98中是这样的:
iterator erase (iterator position);
iterator erase (iterator first, iterator last)
C++11是这样的:
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
我们使用下面的代码进行erase:
#include &iostream&
#include &vector&
int main ()
std::vector&int&
for (int i=1; i&=10; i++) myvector.push_back(i);
myvector.erase (myvector.begin()+5);
myvector.erase (myvector.begin(),myvector.begin()+3);
std::cout && "myvector contains:";
for (unsigned i=0; i&myvector.size(); ++i)
std::cout && ' ' && myvector[i];
std::cout && '\n';
上面的代码非常的完美,但是当把ease用于for循环的时候,就完蛋了:
for(vector&int&::iterator iter=vector_database.begin(); vector_database!=veci.end(); iter++)
if( *iter == 10)
vector_database.erase(iter);
当执行veci.erase(iter)后,迭代器iter指向了哪里?
是时候关注一下erase方法的返回值了:
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.
Member type iterator is a random access iterator type that points to elements.
看到random你就要疯掉了吧,野指针!!!!
也就是说veci.erase(iter)后,iter的状态是不确定的,再进行++,岂有不崩溃的道理!!
解决方法一,就是ease后对iter进行重新赋值。
解决方法二:再 使用一个迭代器。
vector&int&::iterator itor2;
for(vector&int&::iterator iter=vector_database.begin(); iter!=vector_database.end(); )
if( *iter == 10)
vector_database.erase(itor2);
remove or erase?
很多人还用到过remove,但是对于很多人不能分清楚remove和erase的区别?
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size
vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size
erase with remove_if
vector_database.erase(
std::remove_if(vector_database.begin(),
vector_database.end(),
[this](const unique_ptr&lesschat::Channel&& vector_database) {
return this-&current_channel_id_ == vector_database-&channel_id();
C++ vector容器erase操作后iterate失效真相
在使用STL Vector容器时,大家一定遇到进行erase操作后,迭代器会失效的现象。网上很多文章解释说,是因为Vector的底层是通过数组来实现的,erase之后会造成内存的重新分配,故原容器的迭...
关于vector中使用erase删除元素后导致越界的问题
vector中在删除一个元素后,迭代器会自动指向下一个元素,很可能导致迭代器越界。《The C++ Standard Library》中解释:c.erase(pos) Removes the elem...
vector::erase()
vector中如何删除元素?
vector::erase()
vector中如何删除元素?
注意 c++ vector中的erase()
#include vector&
int main()
vectorint&
C++中Vector的erase()操作以及与remove的区别
v.pushback(0);
v.pushback(1);
v.pushback(1);
v.pushback(0);
想要删除值为1的元素
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
iterator erase(
vector中erase用法注意事项
7214人阅读 评论(2)
vectoriterator算法
下列代码的输出为:
v1 = [10 20 30 40 50]
v1.erase( v1.begin( ) );
v1 = 20 30 40 50
2. v1.erase( v1.begin(
1 使用方法
vector.erase()的功能从指定容器中删除指定位置的元素或某段范围内的元素,有以下两种重载方式:
iterator erase(
iterator _Where);//...
没有更多推荐了,vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
iterator erase(
iterator _Where);
1.iterator erase(
iterator _First,
iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
首先我先把MSDN上的例子po上来
// vector_erase.cpp
// compile with: /EHsc
#include &vector&
#include &iostream&
int main( )
vector &int& v1;
vector &int&::iterator I
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
v1.push_back( 40 );
v1.push_back( 50 );
cout && "v1 =" ;
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
cout && " " && *I
v1.erase( v1.begin( ) );
cout && "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
cout && " " && *I
v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
cout && "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
cout && " " && *I
v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50
大家可以知道,需删除元素10只要指定该元素对应的迭代器传给erase就OK了;
那现在如果该容器中有两个元素10要怎么删除呢?
接着我做下修改,向容器中添加一新的元素10
v1.push_back( 10 );
大多数初学者在不熟知erase的原理的时候,也会像我一样这样处理,
一一遍历容器找到元素值为10,然后一一删除
for(Iter = v1.begin(); Iter != v1.end(); Iter++)
if(*Iter == 10)
v1.erase(Iter);
当试着重新build程序后运行,会出现包含有如下信息的错误
_Myptr & ((_Myvec *)(this-&_Mycont))-&_Mylast
其他出现这种原因是没搞懂erase的原理,当调用erase()后Iter迭代器就失效了,变成了一野指针。
所以要处理这种问题,关键是要解决调用erase()方法后,Iter迭代器变成野指针的问题,
这个时候呢给他赋一个新的迭代器给他。
for(Iter = v1.begin(); Iter != v1.end(); Iter++)
if(*Iter == 10)
v1.erase(Iter);
Iter = v1.begin(); //当erase后,旧的容器会被重新整理成一个新的容器
重新Iter迭代器指定下一个元素.
上面那种方法是给Iter重新赋于新v1的begin迭代器。
还有一种方法是直接赋删除元素的下一个迭代器给Iter
实现方法的代码如下:
for(Iter = v1.begin(); Iter != v1.end(); Iter++)
if(*Iter == 10)
Iter = v1.erase(Iter);//Iter为删除元素的下一个元素的迭代器
//即第一次这段语句后Iter 会是20,大家可以通过debug调试出来查看下数值
if(Iter == v1.end()) //要控制迭代器不能超过整个容器
vector.erase()用法介绍及注意事项;
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
iterator erase( ...
STL Vector remove()和erase()的使用
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
例子如下:
#includ...
vector::erase()
vector中如何删除元素?
vector::erase()
vector中如何删除元素?
vector的erase()函数分析
erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素...
关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论1.前言:最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合条件...
1 使用方法
vector.erase()的功能从指定容器中删除指定位置的元素或某段范围内的元素,有以下两种重载方式:
iterator erase(
iterator _Where);//...
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
iterator erase(
iterator _...
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素vector::erase()方法有两种重载形式如下:iterator erase(
iterator _Where)...
在stl中vector容器使用中,有时要在for循环中删除多个元素。
如下使用示例:#include
#includeint main()
关于vecteor::erase(iterator++),导致崩溃的问题
由于使用Cygwin不支持 iter = vector::erase(iterator++)这种写法,导致在使用erase的时候,我都将其改成erase(iterator++)写法。不过最近却因为该写...
没有更多推荐了,vector::erase的效率如何
[问题点数:50分,结帖人zhuzhuluoluo]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:92992
2008年 总版技术专家分年内排行榜第五
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2008年5月 C/C++大版内专家分月排行榜第二2008年3月 C/C++大版内专家分月排行榜第二2007年10月 C/C++大版内专家分月排行榜第二2007年9月 C/C++大版内专家分月排行榜第二2007年6月 C/C++大版内专家分月排行榜第二2007年5月 C/C++大版内专家分月排行榜第二
本版专家分:3167
本版专家分:0
本版专家分:0
本版专家分:1116
本版专家分:10087
2007年10月 C/C++大版内专家分月排行榜第三
本版专家分:76868
2007年4月 C/C++大版内专家分月排行榜第二2007年3月 C/C++大版内专家分月排行榜第二2007年2月 C/C++大版内专家分月排行榜第二2007年1月 C/C++大版内专家分月排行榜第二2006年12月 C/C++大版内专家分月排行榜第二
2007年9月 C/C++大版内专家分月排行榜第三2007年8月 C/C++大版内专家分月排行榜第三2006年11月 C/C++大版内专家分月排行榜第三
本版专家分:18871
2002年7月 C/C++大版内专家分月排行榜第二
本版专家分:17464
2009年3月 Linux/Unix社区大版内专家分月排行榜第二
2009年4月 Linux/Unix社区大版内专家分月排行榜第三
本版专家分:4618
2007年11月 C/C++大版内专家分月排行榜第二
本版专家分:66621
2008年12月 C/C++大版内专家分月排行榜第一2008年3月 C/C++大版内专家分月排行榜第一2007年10月 C/C++大版内专家分月排行榜第一2007年9月 C/C++大版内专家分月排行榜第一2007年8月 C/C++大版内专家分月排行榜第一
2008年9月 C/C++大版内专家分月排行榜第二2008年4月 C/C++大版内专家分月排行榜第二2008年2月 C/C++大版内专家分月排行榜第二2007年7月 C/C++大版内专家分月排行榜第二
2011年10月 C/C++大版内专家分月排行榜第三2009年1月 C/C++大版内专家分月排行榜第三2008年10月 C/C++大版内专家分月排行榜第三2008年5月 C/C++大版内专家分月排行榜第三2007年6月 C/C++大版内专家分月排行榜第三2007年5月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!
其他相关推荐向量容器的成员函数pop_back()可以删除最后一个元素,而函数erase()可以删除由一个iterator指出的元素,也可以删除一个指定范围的元素。
还可以采用通用算法remove()来删除vector容器中的元素,不同的是,采用remove一般情况下不会改变容器的大小,而pop_back()与erase()等成员函数会改变容器的大小。
"stdafx.h"
&iostream&
&algorithm&
using namespace
voidPrintInt(const
int&nData)
cout&&nData&&
int_tmain(int argc, _TCHAR* argv[])
vector&int& vecI
for(int i=0; i&10;++i)
vecInt.push_back(i);
cout&&"向量中的内容为:"&&
for_each(vecInt.begin(),vecInt.end(),PrintInt);
cout&&"vector contains "&&vecInt.size()&&" elements"&&
vecInt.pop_back();//删除最后一个元素
cout&&"删除最后一个元素后,vector contains "&&vecInt.size()&&" elements"&&
vector&int&::iterator k = vecInt.begin();
vecInt.erase(k);//删除第一个元素
//vecInt.erase(k); //迭代器k已经失效,会出错
cout&&"删除第一个元素后,vector contains "&&vecInt.size()&&" elements"&&
//vecInt.erase(vecInt.begin(),vecInt.end()); //删除所有元素
//cout&&"删除所有元素后,vector contains "&&vecInt.size()&&"elements"&& //输出为0
vector&int&::iterator vecNewEnd =remove(vecInt.begin(),vecInt.end(),5);
//删除元素
cout&&"删除元素后,vector contains "&&vecInt.size()&&" elements"&&
cout&&"向量开始到新结束为止的元素:"&&
for_each(vecInt.begin(),vecNewEnd,PrintInt);
cout&&"向量中的元素:"&&
for_each(vecInt.begin(),vecInt.end(),PrintInt);
执行结果:
可以看到:remove算法会返回一个指向新的vector的结尾的iterator,从开始到新这个新的结尾(不含新结尾元素)的范围包含了remove操作后剩余的所有元素。还可以看到,删除向量中的元素后,后面的元素都向前移动了。
另外,迭代器用于erase删除元素后,其后会失效,即不能再用该迭代器操作向量。如,例子中的k,当再次用来删除向量的元素后,就会报错。
vector删除元素之pop_back(),erase(),remove()
1、pop_back()
void pop_back();
Delete last element
Removes the last element in the
vector, effecti...
vector 的删除操作pop_back、erase效率对比
struct Point
Point():x(0),y...
C++9.3.7 容器删除元素--erase、clear、pop_front函数
简介看一下9.5节容器之间的区别—-list类似于链表,容易增删改,queue是两端增删改容易。,所以删除时,用到最多的容器时list1.删除第一个或最后一个元素—–pop_front 和pop_ba...
STL vector中的pop_back方法(22)
原文地址:http://www.cplusplus.com/reference/vector/vector/pop_back/
public member function
一个空的vector执行pop_back操作会发生什么?
由于之前看STL源码剖析的时候,发现所执行的操作如下:
只是简单的将末尾的finish迭代器减1后destroy。这让人产生一个疑问:假如这个vector为空了,finish=start了,fin...
向量容器(vector)是一种顺序容器,是一块连续分配的内存,支持随机访问,从数据安排的角度看,和数组极其相似,数组跟vector的区别在于:数组是静态分配空间,一旦分配了空间的大小,就不可以...
C++编程语言中有一种叫做Vector的应用方法。
标识符(最大容量)
标识符(最大容量...
今天写磁盘调度代码遇到了一个不懂的语句pop_back上网百度了一下:---- 向量容器vector的成员函数pop_back()可以删除最后一个元素.并不真正从vertor里面移走数据。---- 而...
int main()
int arr[] = { 1, 2, 3, 4 };
size_t array_s...
vector::erase()
vector中如何删除元素?
vector::erase()
vector中如何删除元素?
没有更多推荐了,1015 条评论分享收藏感谢收起

我要回帖

更多关于 vector erase 崩溃 的文章

 

随机推荐