精华内容
下载资源
问答
  • 这里vector::erase():从指定容器删除指定位置的元素或某段范围内的元素vector::erase()方法有两种重载形式如下:iterator erase(iterator _Where);iterator erase(iterator _First, iterator _Last);如果是删除指定...

    转自->这里

    vector::erase():从指定容器删除指定位置的元素或某段范围内的元素

    vector::erase()方法有两种重载形式

    如下:

    iterator erase(iterator _Where);

    iterator erase(iterator _First,   iterator _Last);

    如果是删除指定位置的元素时:

    返回值是一个迭代器,指向删除元素下一个元素;

    如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

    #include

    #include

    using namespace std;

    int main()

    {

    vector array;

    array.push_back();

    array.push_back();

    array.push_back();

    array.push_back();

    array.push_back();

    array.push_back();

    vector::iterator itor;

    vector::iterator itor2;

    for(itor=array.begin();itor!=array.end();)

    {

    if(==*itor)

    {

    itor2=itor;

    itor=array.erase(itor2);

    }

    itor++;

    }

    itor=array.begin();

    for(itor=array.begin();itor!=array.end();)

    {

    cout<

    }

    getchar();

    return ;

    }

    看下面的程序,目的是删除数组里面的所有值为6的元素:

    运行结果输出1362,可见其中一个6并未删除,这是迭代器的问题。

    原因在于erase以后,itor已经指向下一个元素了,不应该在itor++,否则会跳过下一个元素,即连续两个6时跳过了第二个6.

    另外,在itor2=itor时,两个itor是一样的,这样做并无意义。可修改如下:

    vector::iterator itor;

    // vector::iterator itor2;

    for(itor=array.begin();itor!=array.end();)

    {

    if(==*itor)

    {

    // itor2=itor;

    itor=array.erase(itor);

    }

    else

    {

    itor++;

    }

    }

    或者:

    vector::iterator itor;

    for(itor=array.begin();itor!=array.end();itor++)

    {

    if(==*itor)

    {

    itor=array.erase(itor);

    itor--;

    }

    }

    也可以使用remove方法:

    array.earse( remove(array.begin(), array.end(),6),  array.end() );

    vector中erase用法注意事项

    以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...

    C&plus;&plus;中使用vector&period;erase&lpar;&rpar;需要注意的事项

    本人菜鸟一枚.. 今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净. 举个栗子: vector num_vec; num_vec.p ...

    c&plus;&plus;中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

    vector&colon;&colon;erase returns incompatible iterator in debug build

    关于std::vector中erase的用法http://www.cplusplus.com/reference/vector/vector/erase/ #include

    STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include . vector 是一个类模板,不是一种数据类型,vector

    C&plus;&plus;学习二 vector的用法&lpar;使用sort对于vector排序&rpar;

    一.vector的介绍 vector是C++里面的一个容器,也是我们数学上面理解的向量,有一些比较常见的操作. 二.vector的定义 #include using nam ...

    STL vector常见用法详解

    中摘取 vector常见用法详解 1. vector的定义 vector name; //typename可以是任何基本类型,例如int, do ...

    vector基本用法

    Vector作为STL容器中的一员,使用频率非常高,因此对其基本用法和实用技巧进行记录,便于后期查询使用. 基本用法 #include #include

    MSDN 中 对vector&colon;&colon;erase&lpar;&rpar;的解释&period;xml

    pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...

    随机推荐

    通过 imagick 让 PHP 生成 PSD 文件缩略图

    第一步.安装ImageMagick 首先需要安装 ImageMagick ,因为 imagick 是一个可以供 PHP 调用 ImageMagick 功能的PHP扩展.(目前最新版本是:ImageMa ...

    Android应用程序消息处理机制

    http://download.csdn.net/detail/luoshengyang/6439647 pdf

    LeetCode&lpar;三&rpar;

    最长不重复子串 public class Solution { public int lengthOfLongestSubstring(String s) { if(s==null || s.leng ...

    4G通信技术LTE介绍

    参考文档在这里 LTE技术 LTE是继GSM/EDGE和UMTS/HSxPA之后的由3GPP推出的移动网络技术最新标准,属于4G. 未来网络需要更高的数据速率,和包路由优化系统.更好的QoA和更廉价的 ...

    JS頁面值傳遞

    Maven工程的Web调试

    1.添加Server,将Web工程和Tomcat关联起来: 1)Windows->Show views->Other-->Servers,将会在下方弹出Server的窗口,然后右键添 ...

    elasticsearch集群搭建实例

    elasticsearch集群搭建实例 下个月又开始搞搜索了,几个月没动这块还好没有落下. 晚上在自己虚拟机上搭建了一个简易搜索集群,分享一下. 操作系统环境: Red Hat 4.8.2-16 el ...

    Heroku登录失败

    Heoku 在国内,注册和登录是个大问题,不知道原来怎么注册上了,如今需要登录删除 app 就是删除不了.. 今天努力找了个vpn ,无奈还是登录不成功.https://id.heroku.com/l ...

    day-1 用python编写一个简易的FTP服务器

    从某宝上购买了一份课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...

    精通CSS&plus;DIV网页样式与布局--页面背景

    上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...

    展开全文
  • vector :: erase()是c ++的内置函数,用于从vector中删除特定元素或删除元素范围。语法:VectorName.erase(pos);VectorName.erase(StartPos,EndPos);在此,VectorName是声明时使用的向量的名称。参数:位置:这是...

    向量是序列容器,就像动态数组一样工作。向量将元素存储在连续的存储位置中,即以线性顺序存储。vector :: erase()是c ++中的内置函数,用于从vector中删除特定元素或删除元素范围。

    语法:VectorName.erase (pos);

    VectorName.erase(StartPos, EndPos);

    在此,VectorName是声明时使用的向量的名称。

    参数:位置:这是要删除的向量元素的位置,由迭代器表示。

    StartPos:它是迭代器,指定要删除的范围的开始。

    EndPos:迭代器指向要从范围中删除的最后一个元素之前的一个位置。

    注意:擦除(StartPos,EndPos)指定范围,该范围包括StartPos和EndPos之间的所有元素,包括StartPos指向的元素,但不包括EndPosi指向的元素。e [StartPos,EndPos)。

    示例1:此示例显示vector :: erase()函数的基本工作。#include

    #include

    using namespace std;

    int main ()

    {

    std::vector MyVector;

    //插入向量

    for (int i=1; i<=8; i++) MyVector.push_back(i);

    cout <

    for (unsigned i=0; i

    cout <

    cout<

    //删除第三个元素

    MyVector.erase (MyVector.begin()+3);

    cout <

    for (unsigned i=0; i

    cout <

    cout<

    //删除前三个元素:

    MyVector.erase (MyVector.begin(),MyVector.begin()+3);

    cout <

    for (unsigned i=0; i

    cout <

    return 0;

    }

    输出结果After elements insertion :  1 2 3 4 5 6 7 8

    After removing 3rd element:  1 2 3 5 6 7 8

    After removing first three elements:  5 6 7 8

    展开全文
  • 1.还在使用下面代码的小朋友就不应该了 //示例(错误) vector<Entity>::iterator iter; for(iter = entities.begin(); iter != entities.end(); iter++) { //迭代遍历 if(!iter->IsAlive()) //没有活性就移除 { ...

    1.还在使用下面代码的小朋友就不应该了

    //示例(错误)
    vector<Entity>::iterator iter;
    for(iter = entities.begin(); iter != entities.end(); iter++)
    {	//迭代遍历
    	if(!iter->IsAlive())	//没有活性就移除
    	{
    		entities.erase(iter); //看上去很对
    	}
    }

    (其中Entity是类名,entities是vector,iter是遍历的迭代器。)

    <!> 删除是成功的,不过此时iter已经无效,变成了野指针!
    再次直接使用必然会引发 违例访问的RE。

    2.于是可以采用下面的方法

    //示例(标准)
    vector<Entity>::iterator iter;
    for(iter = entities.begin(); iter != entities.end(); )
    { //迭代遍历
     	if(!iter->IsAlive())
     	{	//注意,用到了返回值 ↓
      		iter = entities.erase(iter); 
     	}else{
     		iter++;	//没删的时候才自增
     	}
    }

    或是直接自增

    //示例(标准)
    vector<Entity>::iterator iter;
    for(iter = entities.begin(); iter != entities.end(); )
    { //迭代遍历
      	if(!iter->IsAlive())
      	{
       		 entities.erase( iter++ ); //后置自增
      	}else{
       		iter++;
      	}
    }

    但是我这里的环境还是会崩溃 :(

    后来没有办法,只能想出来这么一招:

    //示例(重遍历法)
    for (i = 0; i < entities.size(); ++i)	//这里没有用迭代器
    {
    	if (!entities.at(i).IsAlive())
    	{
    		//然后重新拿迭代器遍历 (因为erase只能用迭代器)
    		vector<Entity>::iterator iter;
    		iter = entities.begin();
       		int j = 0;
       		//对齐 ↓
       		while (iter != entities.end() && j != i)
        			iter++,j++;
        		//无顾虑删除,反正迭代器不要了 ↓
       		iter = entities.erase(iter);	
       	}
       }

    正常运行!

    感言:要是真的不熟悉——> 让 指针/迭代器 之类的东西少上镜,
    崩溃率会大大下降。

    展开全文
  • 目录 1.erase函数介绍 2.删除vector中的指定元素 3.... https://blog.csdn.net/Xiaohei00000/article/details/49382521/ vector中erase用法注意事项 https://blog.csdn.net/daofengdeba/article/details/7865229

    目录

    1.erase函数介绍

    2.删除vector中的指定元素

    3.删除vector中的指定元素----时间复杂度高版本

    4.删除vector中的指定元素----时间复杂度优化版本----推荐版本

    5.删除vector中的指定元素----利用失效的迭代器


    1.erase函数介绍

    ector::erase():从指定容器删除指定位置的元素或某段范围内的元素

    vector::erase()方法有两种重载形式,分别如下:

    iterator erase(   iterator _Where); 删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素;

    iterator erase(   iterator _First,   iterator _Last); 删除从_First开始到_Lsat位置的元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置。

    2.删除vector中的指定元素

    vector<int> count = {0,1,2,2,2,2,2,3,4};
    for(auto iter=count.begin();iter!=count.end();iter++)
    {
        if(2 == *iter)
        {
            count.erase(iter);
        }
    }
    for(auto const & v : count)
    {
        cout<<v<<","
    }
    cout<<endl;

    打印结果如下:0,1,2,2,3,4,

    可以发现并没有删除干净,这是因为erase之后,迭代器失效,此时的迭代器指向的是删除元素的下一个元素,然后再加上for循环的iter++,这样就会越过一个元素,导致没有被完全删除干净.

    3.删除vector中的指定元素----时间复杂度高版本

    既然在第一次删除2的时候,迭代器已经失效了,那么我们可以在失效后,重置迭代器为begin,再次进行遍历。代码如下:

    vector<int> count = {0,1,2,2,2,2,2,3,4};
    for(auto iter=count.begin();iter!=count.end();)
    {
        if(2 == *iter)
        {
            count.erase(iter);
            iter = count.begin();
        }
        else
        {
            iter++;
        }
    }
    for(auto const & v : count)
    {
        cout<<v<<",";
    }
    cout<<endl;

    这样写是能够把所有的2都删掉,但是存在一个问题,就是每删除一个元素之后都从头开始遍历,效率太低了.

    4.删除vector中的指定元素----时间复杂度优化版本----推荐版本

    由于erase函数的返回值是指向当前被删除元素的下一个元素的迭代器,我们把这个返回值赋给iter,

    vector<int> count = {0,1,2,2,2,2,2,3,4};
    for(auto iter=count.begin();iter!=count.end();)
    {
        if(2 == *iter)
        {
            iter = count.erase(iter);
        }
        else
        {
            iter++;
        }
    }
    for(auto const & v : count)
    {
        cout<<v<<",";
    }
    cout<<endl;

    5.删除vector中的指定元素----利用失效的迭代器

    另外,我在别的博客里面搜erase的时候,有好几个地方都说erase之后,原来的iter成了野指针,于是我用试了一下,发现erase之后原来的iter并不会成为野指针,而是指向被删除元素的下一个元素位置,所以我们不把erase函数的返回值赋给iter,继续使用已经失效的迭代器也是可以完成任务的,代码如下.

    vector<int> count = {0,1,2,2,2,2,2,3,4};
    for(auto iter=count.begin();iter!=count.end();)
    {
        if(2 == *iter)
        {
            count.erase(iter);
        }
        else
        {
            iter++;
        }
    }
    for(auto const & v : count)
    {
        cout<<v<<",";
    }
    cout<<endl;

    参考文献:

    如何正确删除vector中的元素    https://zhengkang.blog.csdn.net/article/details/92801632

    vector.erase()用法介绍及注意事项;    https://blog.csdn.net/Xiaohei00000/article/details/49382521/

    vector中erase用法注意事项    https://blog.csdn.net/daofengdeba/article/details/7865229

    展开全文
  • 参看如下这段代码,我们遍历一个vector使用erase删除其中的一个元素int a[3]={1,2, 3};std::vector a_vec(a, a+3);std::vector::iterator it;printf("member before erase: ");for(it = a_vec.begin(); it != a_...
  • 由于最近项目使用中发现了之前对vector的一个误区,由此发现自己对vect非常不了解,对此进行了一些了解,由此打算写一下关于vector使用方面的注意点,本篇先来讲一下vectorerase功能,若有不对,尽请大家指出首先...
  • 使用Vector.erase(Vector.end())会报错: 我使用cout<<*Vector.end() 看了一下,返回的结果是一个很大的负数,不是vector的末尾元素,那就说明这个迭代器指向了末尾元素的下一个 使用cout<<*(Vector...
  • vector循环删除的时候,erase(it)会返回下一个迭代器的地址,保险的做法是赋值给it 即 it= erase(it)这是vector的内部...vector和map都不能将it++写在for循环,而在循环体内erase(it)!void main(){vector v;v.p...
  • 原则上是用list会更好但我后续还需要下标访问的功能所以只能硬着头皮用vector.erase,但今天在翻看c++20新版本的一些特性的时候发现这个erase_if,使用简单而且速度超快,但具体不知道怎么实现的。 eraseerase_if ...
  • 在下面的代码,我试图用erase删除vector中的所有值为偶数的元素。根据c++primer 11,erase的返回值是指向被删除元素之后元素的迭代器。根据我的想法,我认为既然是删除一个元素,那么该被删除元素之后的所有元素...
  • vector 尾部进行插入和删除操作可以很方便地通过 vector.push_back() 和 vector.pop_back() 函数来进行。 但是想要对中间部分的数据进行增删操作,就需要使用到迭代器。 为了对迭代器的使用进行学习,我们先...
  • vector<int> v = {1,2,3,4,5}; int main() { auto it = find(v.begin(),v.end(),2); // v.erase(it); //删除指定元素 v.erase(v.begin(),v.begin()+2); //删除区间内的元素 for(auto x : v) cout <<...
  • c中vector用法

    千次阅读 2021-05-23 05:46:07
    c中vector用法用法你知道吗?下面小编就跟你们详细介绍下c中vector用法用法,希望对你们有用。c中vector用法用法如下:1 基本操作(1)头文件#include.(2)创建vector对象,vector vec;(3)尾部插入数字:...
  • 1.vector迭代器失效问题 什么情况下会失效?以及失效的原因 vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个...(1)执行erase方法时,指向删除节点及其之后的全部迭代器均失...
  • 前言:vector我们经常使用,对vector里面的基本函数构造函数、增加函数、删除函数、遍历函数我们也会用到。其中在使用遍历之后erase删除元素过程,会出现一种删除最后一个元素破坏了...
  • vector--erase用法

    2021-04-15 21:18:47
    int main() { vector<int>oo; for (int i = 0;i < 8;i++)//放入元素 ... oo.push_back(i);... vector<... it = oo.erase(it);//erase用于删除容器元素,其返回值为删除元素的下一个位置 }
  • 踩坑vector erase()

    2021-01-14 16:12:08
    vector erase(),参数一定要是迭代器,指针也没有,所以想用erase()就得使用 这种方式遍历 vector<TreeNode*>::iterator it; for (it = buff.begin();it!=buff.end();it++) 迭代器如果要使用得加*解引用
  • 首先,vector中并没有remove成员方法,这里说的remove是STL算法的remove函数 vectorerase和remove的区别 知道erase,以及存在的问题,会导致迭代器失效 ⁉️但remove原理真的忘记了,不知道 查找了下,remove是...
  • vector erase和remove辨析

    2021-04-06 22:02:25
    std::vector::erase位于<vector> 两者字面意思都是删除(清除),但是实际操作上却有很大的差别。 iterator erase (const_iterator position):删除指定迭代器位置的元素,返回删除位置后一个位置的迭代器。 ...
  • 本文实例展示了C++vector用法,分享给大家供大家参考。具体如下:一、概述vector是C++标准模板库的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个容器,它能够存放...
  • C ++ vector :: erase()函数vector :: erase()是“ vector”头文件的库函数,用于擦除/删除向量的元素,它可以从指定的迭代器位置删除一个元素,也可以删除一系列元素。注意:要使用向量,请包含标头。vector :: ...
  • C++ vector 用法汇总

    2021-04-22 03:46:35
    标准库Vector类型使用需要的头文件:#includeVector:Vector 是一个类模板。不是一种数据类型。 Vector是一种数据类型。一、 定义和初始化Vectorv1; //默认构造函数v1为空Vectorv2(v1);//v2是v1的一个副本Vectorv3(n...
  • vector的常见用法详解

    2021-03-23 15:11:24
    在考试题,有时会碰到只用普通数组会超内存的情况,这种情况使用vector会让问题的解决便捷许多。另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接...
  • C++ vector使用方法

    2021-05-23 05:47:09
    在 c++ vector 是一个十分有用的容器。它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。C++ 数组很坑,有没有类似 Python list 的数据类型呢...
  • 访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。include c++ stl容器vector的成员函数介绍:Constructors构造函数...
  • java中Vector的简单使用

    2021-03-15 22:42:48
    和C++vector类似,也是可以存储各种类型的元素。引入包importjava.util.Vector;eg.Vectorivec=newVector();Vectorivec=newVector(10);//初始长度为10的ivecVectorivec=newVector(10,5);//初始长度为10,当空间...
  • c语言之vector用法

    千次阅读 2021-05-21 17:35:29
    标准库vector类型是C++中使用较多的一种类模板,vector类型相当于一种动态的容器,在vector中主要有一些基本的操作,接下来分别从以下的几个方面总结:vector对象的定义和初始化vector对象的基本操作,主要包括添加...
  • C++ Vector用法详解

    2021-05-23 12:20:26
    vector是C++标准模版库(STL,Standard Template Library)的部分内容。之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,186
精华内容 16,874
关键字:

vector中erase用法