[C++] 迭代器失效示例

news2024/12/23 17:33:10

迭代器失效:

如果迭代器失效,那么就不能再使用这个迭代器。

如果使用,那么结果是未定义的。

我们以模拟实现vector的insert为例。 

一、野指针

1、insert实现

这里的pos会变成野指针。

当扩完容后,由于空间的改变,_start和_finish和_endofstorage的指向就变了。所以pos失效。

            void insert(iterator pos, const T& x)
            {
                if (_finish == _endofstorage)
                {
                    reserve(capacity() == 0 ? 4 : capacity() * 2);
                }

                iterator end = _finish - 1;
                while (end >= pos)
                {
                    *(end + 1) = *end;
                    --end;
                }

                *pos = x;
                ++_finish;

                
            }

2、Test

    void Test()
    {
        vector<int> v;
        v.push_back(1);
        v.push_back(2);
        v.insert(v.begin(), 0);

        v.push_back(3);
        v.push_back(4);
        v.push_back(5);
        v.push_back(6);

        for (auto e : v)
        {
            cout << e << " ";
        }
        cout << endl;

        v.insert(v.end(), 0);
        v.insert(v.end(), 0);


        for (auto e : v)
        {
            cout << e << " ";
        }
        cout << endl;


    }

3、解决方案

(1)代码

我们可以在扩容之前,先记录pos的偏移量,然后在扩容后,pos更新,这样就解决了上述问题。

            void insert(iterator pos, const T& x)
            {
                size_t len = pos - _start; //记录位置
                if (_finish == _endofstorage)
                {
                    reserve(capacity() == 0 ? 4 : capacity() * 2);
                }
                pos = _start + len; //更新位置

                iterator end = _finish - 1;
                while (end >= pos)
                {
                    *(end + 1) = *end;
                    --end;
                }

                *pos = x;
                ++_finish;

            }

(2)Test

 二、迭代器传值

1、示例

insert插入后it 就失效了(扩容后就会失效),无法访问

因为扩容后,it还是指向旧空间,无法对新空间进行操作。

            void insert(iterator pos, const T& x)
            {
                size_t len = pos - _start;
                if (_finish == _endofstorage)
                {
                    reserve(capacity() == 0 ? 4 : capacity() * 2);
                }
                pos = _start + len;

                iterator end = _finish - 1;
                while (end >= pos)
                {
                    *(end + 1) = *end;
                    --end;
                }

                *pos = x;
                ++_finish;

            }
    void Test()
    {
        vector<int> v;
        v.push_back(1);
        v.push_back(2);



        for (auto e : v)
        {
            cout << e << " ";
        }
        cout << endl;

        v.insert(v.end(), 0);
        v.insert(v.end(), 0);

        vector<int>::iterator it = v.begin() + 3;
        v.insert(it, 88);
        v.insert(it, 88);
        v.insert(it, 88);


        for (auto e : v)
        {
            cout << e << " ";
        }
        cout << endl;

    }

 2、解决方案

在STL库的实现中,会告知insert之后迭代器会失效,不要进行使用。

所以我们应尽量避免使用,或多次使用时,在使用前更新迭代器。

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

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

相关文章

Docker 网络之 ipvlan 和 macvlan

Docker ipvlan 和 macvlan 引言 本文讲解了Docker 网络模式中的 ipvlan 和 macvlan 的区别,目前自己在生产环境中使用的 ipvlan 模式非常问题.也解决了实际业务问题. IPvlan L2 mode example ipvlan 无需网卡混杂模式 , 运行如下命令后可以生成一个 vlan 子接口 , 会和主网…

不懂瞎指挥,就会闯大祸

不懂瞎指挥&#xff0c;就会闯大祸 【安志强趣讲《孙子兵法》第12讲】 【原文】 故君之所以患于军者三&#xff1a;不知军之不可以进而谓之进&#xff0c;不知军之不可以退而谓之退&#xff0c;是谓縻军&#xff1b; 【注释】 患&#xff0c;危害、贻害。 縻&#xff08;m&…

算法通关村第十关 | 归并排序

1. 归并排序原理 归并排序&#xff08;MERARE-SORT&#xff09;简单来说就是将大的序列先视为若干个比较小的数组&#xff0c;分成比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分就是将问题分成一些小的问题分…

【Unity每日一记】计时器——各种方法的实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

如何使用CSS实现一个响应式图片网格布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式图片网格布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴…

【ARM】Day5 uart总线, LED点亮实验(C语言实现)

1. 思维导图 2. LED点灯实验&#xff08;C语言实现&#xff09; gpio.h #ifndef _LED_H__ //防止头文件重复包含_ #define _LED_H__//RCC_MP_AHB4ENSETR寄存器封装 #define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)//GPIO使用封装结构体 typedef struct{v…

postgresql 分组

postgresql 数据汇总 分组汇总聚合函数注意 总结 分组统计总结 高级分组总结 分组汇总 聚合函数 聚合函数&#xff08;aggregate function&#xff09;针对一组数据行进行运算&#xff0c;并且返回单个结果。PostgreSQL 支持以下常见的聚合函数&#xff1a; • AVG - 计算一…

LLM - 大模型评估指标之 ROUGE

目录 一.引言 二.ROUGE-简介 1.ROUGE-N 2.ROUGE-L 3.ROUGE-W 4.ROUGE-S 三.ROUGE-实现 1.How To Use 2.Inputs 3.Outputs 四.总结 一.引言 ROUGE 代表面向召回的研究&#xff0c;用于 Gisting 评估。它包括通过将摘要与人类创建的其他摘要进行比较来自动确定摘要质…

BC108 矩阵交换

描述 KiKi有一个矩阵&#xff0c;他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。 输入描述 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤10,1≤m≤10) 从2到n1行&#xff0c;每行输入m个整数&#xff08;范围-…

【Linux操作系统】深入探索Linux进程:创建、共享与管理

进程的创建是Linux系统编程中的重要概念之一。在本节中&#xff0c;我们将介绍进程的创建、获取进程ID和父进程ID、进程共享、exec函数族、wait和waitpid等相关内容。 文章目录 1. 进程的创建1.1 函数原型和返回值1.2 函数示例 2. 获取进程ID和父进程ID2.1 函数原型和返回值2.…

消息中间件-kafka实战-第六章-kafka加线程池多线程消费

目录 参考架构图延时队列 参考 头条面试&#xff1a;当线上Kafka集群有大量消息积压时&#xff0c;如何利用多线程消费解决消费积压问题 架构图 延时队列

Python查找交作业人数

写在前面&#xff1a; 利用Python实现交作业具体情况&#xff0c;能够高效快捷地收集作业&#xff01; 一、问题&#xff1a;获取test文件夹下的所有文件 二、Python中os.listdir()函数的用法 &#xff08;一&#xff09;os.listdir()函数的基本用法 os.listdir()函数的基本…

linux系统中的中文显示问题

经常遇到这种情况&#xff1a;某些项目的文件中不可避免地包含有中文&#xff0c;在Windows系统中没有任何问题&#xff0c;拷到Linux系统中就出问题了。 1. Linux系统设置 $echo $LANG en_US.iso885915 朋友建议我设置为&#xff1a; export LANGzh_CN.utf8 但我这样设置之…

CSS中的z-index属性有什么作用?如何控制元素在层叠上下文中的显示顺序?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ z-index 属性的作用及控制元素层叠顺序作用 ⭐ 控制元素层叠顺序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff0…

什么是flexbox布局?它有什么特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是 Flexbox 布局&#xff1f;⭐ 特点和优势⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那…

数据结构,线性表,顺序表基础。

1.线性表 线性表特征&#xff1a; 对非空表&#xff0c;a0是表头&#xff0c;无前驱a(n-1)是表尾&#xff0c;无后继其他的都有ai前驱a(i-1)与后继a(i1)。 2、顺序结构存储方式是线性表存储的一种方式&#xff0c;主要体现形式为数组。 #include<stdio.h> #include<st…

密码学学习笔记(十八):Diffie–Hellman (DH) 密钥交换

DH算法是第一个密钥交换算法&#xff0c;也是第一个得到形式化描述的公钥密码算法。 群论 DH密钥交换算法基于数学中的群论&#xff0c;群论也是当今大多数公钥密码的基础。 要使集合及其运算成为一个群&#xff0c;需要满足以下性质&#xff1a; 封闭性&#xff1a;群中两…

Eureka 的几种主动下线服务的方式

补充&#xff1a;在启动eureka服务的时候发现控制台有以下的输出 由此猜想可以通过改接口下线服务&#xff0c; 于是尝试了一下。 果然能从注册中心中移除该实例。 1. 直接停掉服务。 默认情况下&#xff0c;如果Eureka Server在90秒没有收到Eureka客户的续约&#xff0c;它…

树莓派+WordPress:打造专属博客,内网穿透轻松发布到公网!

概述 在本次教程里&#xff0c;我们将在树莓派上搭建一个Wordpress博客站点&#xff0c;开始博客时代&#xff0c;记录生活点滴。同时做内网穿透将博客发布上线&#xff0c;让互联网用户都可以访问到&#xff0c;无需公网ip&#xff0c;也无需购买云服务器&#xff0c;简单快速…

内网隧道代理技术(十六)之 FRP的使用

FRP的使用和介绍 FRP介绍 FRP (Fast Reverse Proxy) 是一个使用 Go 语言开发的高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务。FRP 支持 TCP、UDP、HTTP、HTTPS等协议类型,他支持点对点的转发,还有全流量转发,FRP最大的一个特点是使用SOCKS代理,而SOCKS…