来源: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. git忽略提交:.gitignore

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. Git 忽略文件提交的方法 有三种方法可以实现忽略Gi ...

  2. For 循环 kotlin(10)

    For 循环 for 循环可以对任何提供迭代器(iterator) 的对象进行遍历,语法如下: for (item in collection) print(item) 循环体可以是一个代码块. fo ...

  3. 【导航】JennyHui 老白兔记录贴

    英语控 TED X - > 笔记 程序媛 2019-08-24 Java学习路径规划 思考记录 2018-08-24 常见的工作思考方式 浪费时间 百家讲坛 开卷八分钟

  4. LC 470. Implement Rand10() Using Rand7()

    Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a functio ...

  5. Workflow-产品:泛微工作流引擎

    ylbtech-Workflow-产品:泛微工作流引擎 1.返回顶部 1. 工作流引擎平台技术架构 TECHNOLOGY FRAMEWORK 高度协同系统各应用模块 泛微工作流引擎平台是整个协同办公平 ...

  6. Python3 matplotlib.pyplot 中文乱码 多个直线图 添加图例

    #import之后 font = { 'family' : 'SimHei' } matplotlib.rc('font', **font) # -*- coding:utf-8 -*- import ...

  7. java源码-Semaphore源码分析

    Semaphore内部Sync对象同样也是继承AQS,跟Reentrant一样有公平锁跟非公平锁区分,但是Semaphore是基于共享锁开发,Reentrant是基于独占锁开发.主要就是初始化Sema ...

  8. Docker 容器中搭建 nexus npm私库

    1,版本 dockers :1.13.1   :nexus 3 2,安装 docker pull liumiaocn/nexus 3,启动 项目 详细 Nexus UI 8081 private re ...

  9. Vim常用操作集合

    基本上 vi/vim 共分为三种模式,分别是一般命令模式(Command mode),编辑模式(Insert mode)和命令行模式(Last line mode). 命令模式: 用户刚刚启动 vi/ ...

  10. 【AMAD】django-model-utils -- Django model使用的mixin和utils

    动机 简介 个人评分 动机 为django model系统提供一些可重用的mixin和utils. 简介 django-model-utils1为Django Model提供了下嘛几种分类的utils ...