来源: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. Fastadmin 写关联命名时,最好前后台用同一个model,方便管理(会出现命名空间问题)

    1.php think crud -t test --relation=category(外键表1) --relation=admin(外键表2) --relationforeignkey=categ ...

  2. VMware NAT模式设置静态IP(可上网)

    在搞电商架构的高并发高可用时,需要在VMware新建几个linux虚拟机,如果使用VMware的默认网络是自动获取的,但有时候启动虚拟机IP地址会改变,使用很不方便,所以就整理一份静态IP地址设置的方 ...

  3. oracle表结构表数据导入导出

    --------------------------------------imp/exp------------------------------------------------------- ...

  4. 【.net core 0基础】创建你的第一个.net core应用

    1.下载.NET core相应的SDK,https://dotnet.microsoft.com/download 2.安装完成后,打开命令提示符,输入命令 dotnet,检查是否正确安装,如果命令能 ...

  5. 微信小程序之生成二维码

    最近项目中涉及到小程序的生成二维码,很是头疼,经过多次摸索,整理出了自己的一些思想方法,如有不足,欢迎指正. 首先完全按照小程序的结构依次填坑. pages--index.wxml <view ...

  6. DAY 6考试

    题解: 这题太水辣 注意开 long long 但我不是没开long long 的锅 我是 输出 long long 要用 lld 啊 大梦身先醒,80可海星 PS:百度了一下 long (ld) 和 ...

  7. Android和jS互调技术Demo实现

    package com.loaderman.webviewdemo; import android.os.Bundle; import android.support.v7.app.AppCompat ...

  8. 反向代理,负载均衡——nginx理论

    nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势.  nginx架构? ...

  9. Python深入学习之特殊方法与多范式

    Python深入学习之特殊方法与多范式 Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来 ...

  10. 【HANA系列】SAP HANA中null变成问号的问题

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA中null变成问 ...