1. vector常规用法

  2. vector迭代器失效

通常会出现迭代器失效的情况:

(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;

(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;

1. vector常规用法

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
//vector是将元素置于一个动态数组中加以管理的容器,支持下标索引[],at()方法
//元素是按照值拷贝的方式进行的,所以要提供拷贝构造函数void printVector(vector<int>vectorPrint){for (int c : vectorPrint){cout << c << " ";}cout << endl;
}
int main()
{//1.带参数的构造函数cout << "1.带参数的构造函数" << endl;int a[] = { 0, 1, 2, 3, 4 };int b[] = { 5, 6, 7, 8, 9 ,10 };vector<int>vectorA(a, a + 5);//可以将相对应的内存地址连续的赋值给容器,区间是左闭右开的原则vector<int>vectorB(vectorA.begin(), vectorA.end());//本质上还是两个地址区间的内容进行赋值vector<int>vectorC(3, 9);//构造函数将3个9进行拷贝赋值vector<int>vectorD(vectorA);//两个类型相同的容器进行拷贝赋值printVector(vectorA);printVector(vectorB);printVector(vectorC);printVector(vectorD);//2.赋值操作cout << "2.赋值操作" << endl;vectorA.assign(a, a + 5);//重新分配,不使用拷贝构造函数printVector(vectorA);vectorB.assign(vectorA.begin(), vectorA.end());printVector(vectorB);vectorD = vectorB;printVector(vectorD);vectorB.assign(b, b + 5);//重新分配赋值printVector(vectorB);vectorD.swap(vectorB);// 同类型容器值交换,只覆盖vectorD.size()个位置printVector(vectorD);//3.容器大小操作cout << "3.容器大小操作" << endl;cout<< vectorD.size()<< endl;//求容器的大小bool dempty = vectorD.empty();//判断容器是否为空,是空的话为1cout << "dempty = " << dempty << endl;vectorD.resize(6);//重新设置容器大小,默认使用0填充printVector(vectorD);vectorD.resize(8, 3); //重新设置容器大小,显示调用3填充printVector(vectorD);vectorD.resize(2);    //重写设置大小,截断后面多余部分printVector(vectorD);//4.容器末尾添加和删除元素cout << "4.容器末尾添加和删除元素" << endl;vector<int>vectorE;vectorE.push_back(1);//从末尾插入元素vectorE.push_back(3);vectorE.push_back(5);vectorE.push_back(7);vectorE.push_back(9);printVector(vectorE);vectorE.pop_back();//从末尾弹出元素vectorE.pop_back();printVector(vectorE);//5.vector数据元素的存取cout << "5.vector数据元素的存取" << endl;cout << vectorE[0]<< endl;//根据下标求容器对应位置的值cout << vectorE.at(1) << endl;cout << vectorE.front() << endl;  //返回开始位置元素cout << vectorE.back() << endl;   //返回末尾元素for (vector<int>::iterator it = vectorE.begin(); it != vectorE.end(); ++it) //it++前面++返回引用,后者++返回值cout << *it << " ";                                                     //正向遍历,而且是可以修改的cout << endl;for (vector<int>::reverse_iterator it = vectorE.rbegin(); it != vectorE.rend(); ++it)cout << *it << " ";                                                         //反向遍历 ,而且是可以修改的cout << endl;for (vector<int>::const_iterator it = vectorE.begin(); it != vectorE.end(); ++it)//it++前面++返回引用,后者++返回值cout << *it << " ";                                                     //正向遍历,不可以修改的,是常指针cout << endl;for (vector<int>::const_reverse_iterator it = vectorE.rbegin(); it != vectorE.rend(); ++it)cout << *it << " ";                                                     //反向遍历 ,不可以修改的,是常指针*/cout << endl;//6.插入操作cout << "6.插入操作" << endl;vector<int>vectorF(1);    //填入设置的大小,默认为0vector<int>vectorG(2);    //填入设置的大小,默认为0cout << "vectorF" << endl;printVector(vectorF);cout << "vectorG" << endl;printVector(vectorG);vectorF.insert(vectorF.begin(), 11);        //从vectorF.begin()开始插入此元素cout << "vectorF insert1" << endl;printVector(vectorF);vectorF.insert(vectorF.begin() + 1, 2, 22); //从vectorF.begin()开始插入n个此元素cout << "vectorF insert2" << endl;printVector(vectorF);vectorF.insert(vectorF.begin(), vectorG.begin(), vectorG.end());//从vectorF.begin()开始将整个区间的元素插入此位置//7.删除和清除操作cout << "7.删除和清除操作" << endl;printVector(vectorF);vectorF.clear();//删除此容器内的所有元素printVector(vectorF);vector<int>::const_iterator it = vectorF.begin(); //常指针,删除会报错vectorF.erase(it);           //删除位置上的元素,但是参数是迭代器// 删除的时候该函数返回的是删除位置的下一个位置的迭代器vectorF.erase(it, it + 3);   //删除迭代器所指向的区间的元素return 0;
}

2.迭代器失效

(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;

(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;

通俗讲

vector<int>::iterator it = vectorE.begin(); it != vectorE.end(); ++it) 通过it迭代器增加或者删除

在获取到vector对象的首元素地址后,后面在进行插入和删除进行操作时,有可能会发生vector的自动扩容或者缩容,因此导致it迭代器指向的地址不一样,导致迭代器失效

STL标准模版库--vector的操作集合相关推荐

  1. STL(标准模板库)—Vector

    目录 Vector 1.创建一个名为V的vector容器 整型数组 2.vector容器中存放自定义的数据类型 3.vector容器嵌套容器 Vector遍历打印函数 vector容器_构造函数 1. ...

  2. STL(标准模板库)理论基础与容器

    10.1 STL(标准模板库)理论基础 10.1.1基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被 ...

  3. 【跟学C++】C++STL标准模板库——算法详细整理(中)(Study18)

    文章目录 1.简介 2.STL算法分类及常用函数 2.1.变序算法(一) 2.2.1 初始化算法(2个) 2.2.2 修改算法(2个) 2.2.3 复制算法(6个) 2.2.4 删除算法(6个) 3. ...

  4. 信息学奥赛中的STL(标准模板库)--2022.09.30

    1.信息学奥赛一本通 第5版 第8章 C++实用技巧与模版库(6节) 第一节  排序算法 第二节 运算符重载 第三节  字符串(string) 第四节 FIFO队列和优先队列 第五节  动态数组 第六 ...

  5. C++ STL 标准模板库介绍与入门

    目录 1.概述 1.1.C++ 标准库 1.2.Boost库 2.STL 版本 2.1.HP 原始版本 2.2.P. J. 实现版本 2.3.RW 实现版本 2.4.SGI 实现版本 2.5.STLp ...

  6. C++提高编程----STL标准模板库-常用容器

    STL标准模板库(Standard Template Library)-常用容器 C++的,面向对象和泛型编程,目的就是提高代码的复用性:为了建立数据结构和算法的统一标准,诞生了STL 一.STL初识 ...

  7. STL 标准模板库—容器部分【C++】

    STL标准模板库 包含内容: 容器类:vector.list.deque.set.map等 迭代器:"泛型指针",每个容器都有自己的迭代器,[vector和deque的迭代器是随机 ...

  8. C++入门到精通 ——第七章 STL标准模板库大局观

    七.STL标准模板库大局观 Author: XFFer_ 先分享一本 <C++ 标准库 第二版> ,望在STL的道路上从入门到放弃!(开玩笑的啦,愈行愈远~) 链接: https://pa ...

  9. 补8-5日复习内容 STL 标准模板库的容器

    //有关 STL 标准模板库的函数 /* string 的 */ /* #include <iostream> #include <string> #include <w ...

  10. 0705第七讲标准模版库

    0705第七讲标准模版库 1.namespace:命名空间,解决相同作用域同名函数或变量问题 要求:使用时必须以'命名空间::成员名称'的格式 类型转换:强制类型转换(向下转换) 动态类型转换:dyn ...

最新文章

  1. 机器学习160个常见问题.pdf
  2. 高性能javascript-数据访问笔记
  3. linux内核 header.s,Linux启动代码header.S研究
  4. python数据分析准备_使用Python进行数据分析I 环境准备
  5. python模板模式_python-模板方法模式
  6. 【渝粤教育】21秋期末考试建筑力学与结构10126k2111
  7. 怎么在c语言里输入数组元素,如何在不输入n的情况下输入数组中的元素? (C )...
  8. Android10虚拟硬件,编辑 Android 虚拟设备属性
  9. 如何在DOS下用TCP/IP协议进行登录Windows 2K?
  10. 调整计算机屏幕亮度快捷键,笔记本亮度调节的快捷键
  11. Mac OS X: 彻底删除GeekTool(bash脚本)
  12. java中抽象类继承抽象类_邮政编码作为Java中抽象类的示例
  13. MODERN ROBOTICS MECHANICS, PLANNING, AND CONTROL
  14. HTML网页内联框架
  15. Linux配置文件-limits.conf
  16. 什么叫手机或设备的ID
  17. 值得您收藏的png图标第二辑
  18. Threejs创建几何体并贴材质
  19. 定义一个Instrument(乐器)类,并使用共有的play()方法,再分别定义子类 管乐器 打击乐器 弦乐器,使用重写play方法,实现每种乐器的独特play方式。
  20. 抖音TikTok国际版可切换全球任意地区

热门文章

  1. Futter基础第15篇: 实现类似闲鱼App底部导航凸起按钮
  2. 通过mapreduce把mysql的数据读取到hdfs
  3. shiro框架学习(一)
  4. (转) SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程
  5. 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice
  6. php 非常简单的导入sql文件
  7. 一个jQuery扩展工具包
  8. ASP.NET程序中 抛出Thread was being aborted. 异常(转)
  9. MySQL删除主从表数据
  10. PIM SM报文抓包和总结