vector 迭代器失效问题

news2024/11/20 20:40:54

vector 迭代器失效

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间 , 造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。
在这里插入图片描述

对于vector可能会导致其迭代器失效的操作有:

指定位置元素的删除操作–erase

VS下的

#include <iostream>
using namespace std;
#include <vector>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	int sz = v.capacity();
	// 使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	// 删除pos位置的数据,导致pos迭代器失效。
	v.erase(pos);
	cout << *pos << endl; // 此处会导致非法访问
	return 0;
}

在这里插入图片描述
在这里插入图片描述

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。

与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello");
	auto it = s.begin();
	// 放开之后代码会崩溃,因为resize到20会string会进行扩容
	// 扩容之后,it指向之前旧空间已经被释放了,该迭代器就失效了
	// 后序打印时,再访问it指向的空间程序就会崩溃
	//s.resize(20, '!');
	while (it != s.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;
	it = s.begin();
	while (it != s.end())
	{
		it = s.erase(it);
		// 按照下面方式写,两编译器运行时程序都会崩溃,因为erase(it)之后
		// it位置的迭代器就失效了
		// s.erase(it); 
		//++it;
	}
	return 0;
}

Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。

// 2. erase删除任意位置代码后,linux下迭代器并没有失效
// 因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> v{1,2,3,4,5};
    vector<int>::iterator it = find(v.begin(), v.end(), 3);
    v.erase(it);
    cout << *it << endl;
    while(it != v.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

//erase删除的迭代器如果是最后一个元素,删除之后it已经超过end
// 此时迭代器是无效的,++it导致程序崩溃
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> v{1,2,3,4,5};
    // vector<int> v{1,2,3,4,5,6};
    auto it = v.begin();
    while(it != v.end())
    {
        if(*it % 2 == 0)
        v.erase(it);
        ++it;
    }
    for(auto e : v)
    {
        cout << e << " ";
    }
    cout << endl;
    return 0;
}

使用第一组数据时,程序可以运行
在这里插入图片描述
使用第二组数据时,程序最终会崩溃
在这里插入图片描述
从上述二个例子中可以看到:SGI STL中,迭代器失效后,代码并不一定会崩溃,但是运行结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的。
迭代器失效,不要在访问了,行为结果未定义(不同的编译器有不同的实现)

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

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

相关文章

总结896

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff09;…

读改变未来的九大算法笔记09_指尖的精灵

1. 人类很有可能“在未来像过去所做过的一样行事” 2. 计算机科学领域并不仅仅是编程 2.1. 编程知识是计算机科学家所必需的&#xff0c;但它却只是前提 2.2. 要应用并试验算法&#xff0c;计算机科学研究者就需要将算法转换成计算机程序&#xff0c;而每个程序都由Java、C或…

AMC12和高考数学哪个更难?知识点有哪些不同?

AMC12和高考数学哪个更难&#xff1f;知识点有哪些不同&#xff1f;今天小编给大家来详细介绍一下&#xff01; 难度对比 从难度上看&#xff0c;高考数学的计算量更大&#xff0c;并且知识点比AMC10/12超前&#xff0c;需要用到极限和微积分的知识。 反观AMC10/12不需要用到…

LinkedHashMap源码

介绍 LinkedHashMap是HashMap的子类 Key和Value都允许空有序key可重复可覆盖&#xff0c;value可重复非线程安全可用于实现LRU public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>LinkedHashMap的原理图&#xff1a; LinkedHashMa…

【Jetpack】Room 中的销毁重建策略 ( 创建临时数据库表 | 拷贝数据库表数据 | 删除旧表 | 临时数据库表重命名 )

文章目录 一、销毁 和 重建策略二、销毁 和 重建策略 核心要点1、创建 Migration 迁移类 - 重点2、配置 Migration 迁移类3、修改数据库版本号4、修改实体类数据类型 三、完整代码示例1、数据库版本 3 代码示例RoomDatabase 数据库类完整代码Student 实体类完整代码执行结果 2、…

chatgpt赋能python:Python编程爱好者必备:如何参加线上比赛

Python编程爱好者必备&#xff1a;如何参加线上比赛 作为一名拥有10年Python编程经验的工程师&#xff0c;我非常喜欢参加线上编程比赛。在这些比赛中&#xff0c;我可以与全球的编程爱好者一起竞技&#xff0c;展现自己编程的优势和挑战自己的能力。在这篇SEO文章中&#xff…

数论与组合数学 期末总结(完结)

数论与组合数学 自然数的基本性质整除最大公约数&#xff08;GCD&#xff09;辗转相除法欧几里得算法 互质 Coprime素数算数基本定理 同余欧拉定理欧拉函数费马小定理威尔逊定理 逆元求逆&#xff1a;欧几里得扩展算法 线性同余方程组 ( a x b m o d m ) (axb\ mod\ m) (axb m…

2023数维杯A题水体污染对流弥散吸附完整论文及所有数值计算模拟代码

大家好呀&#xff0c;从昨天发布赛题一直到现在&#xff0c;总算完成了数维杯A题完整的成品论文。 A题论文37页&#xff0c;一些修改说明提醒7页&#xff0c;正文22页&#xff0c;附录8页 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴…

chatgpt赋能python:Python如何快速取出所有元素?

Python如何快速取出所有元素&#xff1f; 随着Python编程的流行&#xff0c;我们常常需要处理列表、元组和字典等数据结构。在这些数据结构中&#xff0c;最常见的操作是获取所有元素。本文将介绍如何使用Python来快速取出所有元素。 获取列表中所有元素 在Python中&#xf…

简易操作系统:使用Python 做的图形界面 C 做的内核

目录 实验要求 一、文件管理和用户接口 ⑴文件的逻辑结构 ⑵磁盘模拟 ⑶目录结构 ⑷磁盘分配 ⑸磁盘空闲存储空间管理 ⑹用户接口 ⑺屏幕显示 代码部分 python调用c的方法&#xff1a; ​编辑 c语言部分&#xff0c;文件名 Operating_System_C.c python语言部分 运…

2023认证杯数学建模第二阶段C题完整原创论文讲解

大家好呀&#xff0c;从昨天发布赛题一直到现在&#xff0c;总算完成了认证杯二阶段C题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 C第二阶段完整论文共64页&#xff0c;一…

越跌越买!192亿大举抄底

虽然本周主流大盘指数表现乏力&#xff0c;但股票ETF市场再现资金逢低“扫货”。 截至6月9日收盘&#xff0c;全市场736只股票ETF&#xff08;统计股票ETF和跨境ETF&#xff09;总份额增长196亿份&#xff0c;净流入资金约192亿元&#xff0c;再现“越跌越买”的趋势。 其中&…

理解原子操作与CAS锁

理解原子操作与CAS锁实现 线程间内存访问同步的问题理解cpu的存储体系结构cpu存储架构cache line了解一下写回策略 write-back多线程运行在cpu的多核之中&#xff0c;数据怎么共享&#xff0c;怎么同步&#xff1f;通过事件串行化通过MESI 原子操作CAS锁 线程间内存访问同步的问…

chatgpt赋能python:如何去除Python列表中的中括号

如何去除Python列表中的中括号 在Python中&#xff0c;列表是一个非常重要的数据类型。它可以存储多个不同类型的元素&#xff0c;并且可以动态地增加或删除元素。但是&#xff0c;有时候我们需要将列表中的元素取出来&#xff0c;而不想要中括号。本文将介绍两种不同的方法来…

.net framework 命令行项目使用 sqlite,DbContext

文章目录 背景描述实际操作环境安装Nuget包安装三者之间的关系ORM解释 项目从零开始创建过程新建项目安装nugetDB first和Code first新建文件注意&#xff0c;DbContext命名运行测试基础增删改查和原生sql操作查增&#xff0c;删&#xff0c;改增改删 sql语句执行sql查询sql执行…

QFIELD在遥感数据处理中的应用

概述 从卫星图像生成的土地覆盖绘图需要地面实况数据&#xff0c;以便“训练”分类算法&#xff0c;并计算最终地图的准确性。地面实况数据由具有准确位置的数据点和来自已知土地覆盖类型的预定义列表的标签组成。本教程将指导用户完成斐济苏瓦训练区的地面实况数据收集。 收…

chatgpt赋能python:Python反向画圆的方法

Python反向画圆的方法 介绍 Python是一种高级编程语言&#xff0c;在数据科学、机器学习、Web开发等领域具有广泛的应用。其中&#xff0c;Python的图形绘制能力也颇为强大&#xff0c;可以利用Python编写出各种图形和动画效果。本文将介绍Python如何反向画圆&#xff0c;通过…

chatgpt赋能python:Python如何去除空行?

Python如何去除空行&#xff1f; 在Python编程中&#xff0c;经常会遇到需要去除文本文件或字符串中的空行的情况。空行通常是在文件或字符串中不希望存在的&#xff0c;因为它们可能会影响代码的可读性和执行效率。但是&#xff0c;如何才能在Python中高效地去除空行呢&#…

CSS布局模式之Flex布局Grid布局

文章目录 1. 简介1.1 什么是CSS布局&#xff1f;1.2 为什么使用CSS布局&#xff1f; 2. Flex布局2.1 什么是Flex布局&#xff1f;2.2 Flex容器和Flex项目2.3 Flex容器的属性2.3.1 flex-direction2.3.2 justify-content2.3.3 align-items2.3.4 align-content 2.4 Flex项目的属性…

计算机视觉-目标检测(一):从 R-CNN 到 Faster R-CNN

文章目录 1. 概要2. 区域卷积卷积神经网络R-CNN2.1 模型结构2.2 Selective Search2.3 warp2.4 R-CNN训练2.5 R-CNN推理2.6 R-CNN性能评价2.7 R-CNN的缺点 3. SPP-Net3.1 SPP-Net对RCNN的改进3.2 SPP-Net网络结构3.3 SPP-Net训练过程3.4 SPP-Net的问题 4. Fast R-CNN4.1 Fast R-…