记录C++中,vector的迭代器在push_back以后扩容导致迭代器失效的问题

前言

        vector是我们用到最多的数据结构,其底层数据结构是单端动态数组,由于数组的特点,vector也具有以下特性: ①O(1)时间的快速访问; ②顺序存储,所以插入到非尾结点位置所需时间复杂度为O(n),删除也一样; ③扩容规则: 当我们新建一个vector的时候,会首先分配给他一片连续的内存空间,如std::vector vec,当通过push_back向其中增加元素时,如果初始分配空间已满,就会引起vector扩容,其扩容规则在gcc下以2倍方式完成:

  •         首先重新申请一个2倍大的内存空间;
  •         然后将原空间的内容拷贝过来;
  •         最后将原空间内容进行释放,将内存交还给操作系统;


注意事项:根据vector的插入和删除特性,以及扩容规则,我们在使用vector的时候要注意,在插入位置和删除位置之后的所有迭代器和指针引用都会失效,同理,扩容之后的所有迭代器指针和引用也都会失效。

原文链接:https://blog.csdn.net/qq_45311905/article/details/117020436

问题1:使用{}赋值,会丧失扩容功能

        vector的最原始大小是0,如果使用{}方法去赋值,那么会丧失扩容功能

#include <iostream>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 获取第二个元素的迭代器auto it = numbers.begin() + 1;// 在第二个位置插入一个新元素,导致vector扩容numbers.insert(numbers.begin() + 1, 10);// 尝试访问迭代器指向的元素,会导致未定义行为    会打印随机值std::cout << "Value at iterator: " << *it << std::endl;// 实际值:std::cout << "Value at iterator: " << numbers[1] << std::endl;return 0;
}

会发现打印随机值

如果不使用{}就没问题:

#include <iostream>
#include <vector>int main() {std::vector<int> numbers;numbers.push_back(1);numbers.push_back(2);numbers.push_back(3);numbers.push_back(4);numbers.push_back(5);// 获取第二个元素的迭代器auto it = numbers.begin() + 1;// 在第二个位置插入一个新元素,导致vector扩容numbers.insert(numbers.begin() + 1, 10);// 尝试访问迭代器指向的元素,会导致未定义行为    会打印随机值std::cout << "Value at iterator: " << *it << std::endl;// 实际值:std::cout << "Value at iterator: " << numbers[1] << std::endl;return 0;
}

问题2:在push_back()以后,继续使用迭代器会触发扩容导致迭代器失效

#include <iostream>
#include <vector>int main() {std::vector<int> numbers;size_t max_capacity = 0;max_capacity = numbers.capacity();std::cout<<"max:"<<max_capacity<<std::endl;		// 0// 第一次添加数据,会导致第一次扩容numbers.push_back(100);auto it = numbers.begin() + 0;std::cout<<"*it:"<<*it<<std::endl;std::cout<<"number[0]:"<<numbers[0]<<std::endl;std::cout<<std::endl;// 第二次添加数据,会导致第二次扩容,迭代器失效,下标法不会失效numbers.push_back(2);max_capacity = numbers.capacity();std::cout<<"max:"<<max_capacity<<std::endl;std::cout<<"*it:"<<*it<<std::endl;std::cout<<"number[0]:"<<numbers[0]<<std::endl;it = numbers.begin() + 0;std::cout<<"new *it:"<<*it<<std::endl;std::cout<<std::endl;// 第三次添加数据,会导致第三次扩容,但是发现迭代器并没有失效,下标法不会失效numbers.push_back(2);numbers.push_back(2);numbers.push_back(2);numbers.push_back(2);max_capacity = numbers.capacity();std::cout<<"max:"<<max_capacity<<std::endl;std::cout<<"*it:"<<*it<<std::endl;std::cout<<"number[0]:"<<numbers[0]<<std::endl;it = numbers.begin() + 0;std::cout<<"new *it:"<<*it<<std::endl;std::cout<<std::endl;//  因为一种在增加,所以发现程序所占内存越来越大	
//	for (int i = 1; ; ++i) {
//		numbers.push_back(i);
//		if (numbers.size() > numbers.capacity()) {
//			max_capacity = numbers.size() - 1;
//			break;
//		}
//	}return 0;
}

        原因是,在最开始的时候,vector的容量是0,随着push-back,会不断 x2 的去增加容量,但是增加容量的时候,最开始获取的迭代器指针去获取数据的方式就失效了,不过好在使用下标并不会失效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划--(递推2(最长上升子序列,格子染色,斐波那切数列,奇数塔问题,最长子段和))

1281&#xff1a;最长上升子序列 【题目描述】 一个数的序列bi &#xff0c;当b1<b2<…<bS 的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN) &#xff0c;我们可以得到一些上升的子序列(ai1,ai2,…,aiK) &#xff0c;这里1≤i1<i2<…

uniapp开发微信小程序设置分包,简单易学

文章目录 前言一、在 manifest.json文件中的源码试图中配置二、配置pages.json 前言 我们使用uniapp开发微信小程序的时候&#xff0c;当我们的包体积过大的时候&#xff0c;无法真机模拟。 因为小程序单个包只支持2MB&#xff08;现已支持预览4MB&#xff09;&#xff0c;所以…

Docker 学习总结(81)—— 冷门而又实用的 Docker 使用技巧总结

1、docker top 这个命令是用来查看一个容器里面的进程信息的,比如你想查看一个 nginx 容器里面有几个 nginx 进程的时候,就可以这么做。 ➜ ~ docker top 3b307a09d20d UID PID PPID C STIME …

JAVA面试大全之开发基础篇

目录 1、常用类库 1.1、平时常用的开发工具库有哪些? 1.2、Java常用的JSON库有哪些?有啥注意点? 1.3、Lombok工具库用来解决什么问题?

AI:155-基于深度学习的股票价格预测模型

本文收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正在不断更新中~ 一.基于深度学习的股票价格预测模型 …

基于k8s的web服务器构建

文章目录 k8s综合项目1、项目规划图2、项目描述3、项目环境4、前期准备4.1、环境准备4.2、ip划分4.3、静态配置ip地址4.4、修改主机名4.5、部署k8s集群4.5.1、关闭防火墙和selinux4.5.2、升级系统4.5.3、每台主机都配置hosts文件&#xff0c;相互之间通过主机名互相访问4.5.4、…

深入解析大数据Scala面试题及参考答案(持续更新)

Scala,作为一种多范式编程语言,因其强大的功能性和与Java的互操作性,在大数据和并发编程领域备受青睐。本文将深入探讨10个常见的Scala面试题,并提供详尽的参考答案,以期帮助读者在面试中展现其Scala编程的深厚功底。 目录 1. Scala的基本特性是什么? 2. 什么是函数式…

总结IP协议各类知识点

前言 本篇博客博主将详解IP协议中的各类知识点&#xff0c;坐好板凳发车啦~ 一.IP协议格式 1.1 4位版本号&#xff08;version&#xff09; 指定IP协议的版本&#xff0c;对于IPv4来说&#xff0c;就是4。 1.2 4位头部长度&#xff08;header length&#xff09; IP头部的…

HarmonyOS像素转换-如何使用像素单位设置组件的尺寸。

1 卡片介绍 基于像素单位&#xff0c;展示了像素单位的基本知识与像素转换API的使用。 2 标题 像素转换&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例&#xff0c;向开发者讲解了如何使用像素单位设…

【LeetCode热题100】【多维动态规划】最长公共子序列

我昨天面了天美L1的游戏客户端开发&#xff0c;面了我100分钟&#xff0c;问完实习、项目、计算机图形学和C后给了我两道算法题做&#xff0c;一道是最长公共子序列&#xff0c;一道是LRU缓存&#xff0c;我知道是经典的题目&#xff0c;但是我都没敲过&#xff0c;最长公共子序…

大数据-Hadoop---基础配置案例

VMware17创建新虚拟机&#xff1a; 1.静态设置与关闭防火墙 在终端命令行依次输入&#xff1a; 1&#xff09;cd /etc 2) ls 3) cd sysconfig/ 4) cd network-scripts/ 5) ls 6) vi ifcfg-nes33 在cmd命令栏输入&#xff1a;ncpa.cpl,是找网络适配器的命令 IPADDR&qu…

elementui el-input输入框类型为textarea时,将输入的数据保存换行和空格,并展示换行和空格

el-input输入框类型为textarea时&#xff0c;如果不做数据处理&#xff0c;是不会保存换行和空格的说输入了换行&#xff0c;但是保存数据后不会进行换行&#xff0c;需要保存输入的换行。 1、效果图 输入状态&#xff1a; 显示时&#xff1a; 2、实现代码 2.1、html部分&am…

在jupyter notebook中使用conda环境

在jupyter notebook中使用conda环境 1. 环境配置 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda install nb_cond…

在新能源充电桩、智能充电枪、储能等产品领域得到广泛应用的两款微功耗轨至轨运算放大器芯片——D8541和D8542

D8541和D8542是我们推荐的两款微功耗轨至轨运算放大器芯片&#xff0c;其中D8541为单运放&#xff0c; D8542为双运放&#xff0c;它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用&#xff0c;在新能源充电桩、智能充电枪、…

网络编程--高并发服务器(二)

这里写目录标题 线程池高并发服务器UDP服务器TCP与UDP机制的对比TCP与UDP优缺点比较UDP的C/S模型实现思路模型分析实现思路&#xff08;对照TCP的C/S模型&#xff09; 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二…

【跟着CHATGPT学习硬件外设 | 05】I2C

本文根据博主设计的Prompt由CHATGPT生成&#xff0c;形成极简外设概念。 &#x1f680; 1. 概念揭秘 I2C&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也被称为IIC或双线接口&#xff0c;是一种用于微控制器&#xff08;Microcontrollers&#xff09;和外设…

前端开发学习笔记(1)

文章目录 基础概念VSCode常用插件和快捷键VSCode常用插件VSCode常用快捷键 常用标签和属性 基础概念 网页和网站&#xff1a; 网页&#xff1a;网站中的一页&#xff0c;通常是HTML格式的文件。网页是由网页元素组成的&#xff0c;这些元素用HTML标签描述&#xff0c;然后通过…

用navicat进行mysql表结构同步

用navicat进行mysql表结构同步 前言新增一个列然后进行表结构同步删除一个列然后进行表结构同步把Int列转成TinyInt列&#xff0c;看数字溢出的情况下能不能表结构同步总结 前言 从同事那边了解到还能用navicat进行表结构同步&#xff0c;他会在发布更新的时候&#xff0c;直接…

如何在智能交通系统中使用物联网技术提高道路安全和效率

在智能交通系统中&#xff0c;物联网&#xff08;IoT&#xff09;技术可以通过多种方式提高道路安全和效率。以下是利用物联网技术提高智能交通系统效能的具体方法&#xff1a; 1. 车与路、车与车通信&#xff08;V2X&#xff09;&#xff1a;通过在道路上部署传感器和路侧单元…

Python基础之Class类的定义、继承、多态

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、class类1.类属性操作&#xff08;增删改&#xff09;2.类方法操作 二、类的继承1、语法2、方法重写 二、类的多态 一、class类 、三部分组成 1、类名&#xff…