来源:https://blog.csdn.net/duan19920101/article/details/50717748

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

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

如下:

1、iterator erase(iterator _Where);

v1.erase( v1.begin( ) );//删除v1中的第一个元素

vec.erase(vec.begin()+2);删除第3个元素

2、iterator erase(iterator _First,iterator _Last);

//删除v1.begin() + 1和v1.begin() + 2两个元素

v1.erase(v1.begin() + 1, v1.begin() + 3);

vec.erase(vec.begin()+i,vec.begin()+j);删除区间[i,j-1];区间从0开始

插入元素:vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

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

  1.  
    #include "stdafx.h"
  2.  
    #include <cv.h>
  3.  
    #include <vector>
  4.  
    #include <iostream>
  5.  
    using namespace std;
  6.  
    int main()
  7.  
    {
  8.  
    using namespace std;
  9.  
    vector <int> v1;
  10.  
    vector <int>::iterator Iter;
  11.  
    v1.push_back(10);
  12.  
    v1.push_back(20);
  13.  
    v1.push_back(30);
  14.  
    v1.push_back(40);
  15.  
    v1.push_back(50);
  16.  
    cout << "v1 =";
  17.  
    for(Iter = v1.begin(); Iter != v1.end(); Iter++)
  18.  
    cout << " " << *Iter;
  19.  
    cout << endl;
  20.  
    v1.erase(v1.begin());//删除v1的第一个元素
  21.  
    cout << "v1 =";
  22.  
    for(Iter = v1.begin(); Iter != v1.end(); Iter++)
  23.  
    cout << " " << *Iter;
  24.  
    cout << endl;
  25.  
    //删除v1.begin() + 1和v1.begin() + 2两个元素
  26.  
    v1.erase(v1.begin() + 1, v1.begin() + 3);
  27.  
    cout << "v1 =";
  28.  
    for(Iter = v1.begin(); Iter != v1.end(); Iter++)
  29.  
    cout << " " << *Iter;
  30.  
    cout << endl;
  31.  
    }

v1.erase( v1.begin( ) );//删除v1中的第一个元素

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()) //要控制迭代器不能超过整个容器

{

break;

}

}

[转载]C++STL—vector的插入与删除的更多相关文章

  1. Problem I: STL——多重集的插入和删除

    Problem I: STL--多重集的插入和删除 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1729  Solved: 1258[Submit][ ...

  2. C++STL——vector类

    vector容器 1.1 vector容器的基本概念 Array 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬 ...

  3. 转载:C++ vector 类学习笔记

    声明:本文转载自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机 ...

  4. 【转载】STL 的 erase() 陷阱-迭代器失效总结

    下面材料整理自Internet&著作. TL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.se ...

  5. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  6. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  7. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  8. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  9. java三篇博客转载 详解-vector,stack,queue,deque

    博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...

随机推荐

  1. SRS之SrsConfig类

    1. 类定义 1.1 SrsConfig 类 /** * the config service provider. * for the config supports reload, so never ...

  2. mongo数据库的使用

    mongodb 是一个非关系型数据库,跟每一个数据库都没有关系,(mysql 是一个关系型数据库)他以集合(collections)问单位,他长得和 json 一样 mongo 数据库的下载,安装 自 ...

  3. linux系统创建windows启动盘

    平时工作中用到linux的操作命令较多,因此为了方便,就给电脑装了双系统,一般工作的时候,都选择进入linux系统.但是今天有件工作之外的事情需要解决下:创建一个windows启动盘.如果按照往常来说 ...

  4. MessageBox 弹框

    模拟系统的消息提示框而实现的一套模态对话框组件,用于消息提示.确认消息和提交内容.  从场景上说,MessageBox 的作用是美化系统自带的 alert.confirm 和 prompt,因此适合展 ...

  5. linux下mysql定时备份,数据保存周期一周

    以下脚本来自网络,版权归原作者所有(推荐放在夜间自动备份,用cron制定计划任务) crontab -e 0 3 * * * /var/erp/data/mysql_backup.sh #!/bin/ ...

  6. CentOS(Oracle_Linux)系统网卡配置文件参数详解

    Each physical and virtual network device on an Oracle Linux system has an associated configuration f ...

  7. CentOS 安装jdk 1.8

    方法一:手动解压JDK的压缩包,然后设置环境变量   1.在/usr/目录下创建java目录  [root@localhost ~]# mkdir/usr/java [root@localhost ~ ...

  8. Python爬虫学习==>第十章:使用Requests+正则表达式爬取猫眼电影

    学习目的: 通过一个一个简单的爬虫应用,初窥门径. 正式步骤 Step1:流程框架 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: 正则表达式分析:根据html ...

  9. Django模板系统-母板和继承

    母板和继承 母版 html页面,提取多个页面的公共部分 定义多个block块,需要让子页面进行填充 <head> {% block page-css %} {% endblock %} & ...

  10. python学习之那些你不在乎却操作非主流的练习题(一)

    1.写代码,有如下列表,按照要求实现每⼀个功能 lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt ...