C++的vector使用

news2025/1/11 16:45:56

vector

  • 1.vector的介绍
  • 2.vector的使用
    • 2.1. vector的定义(构造函数)
    • 2.2. vector iterator的使用
    • 2.3. vector空间增长问题
    • 2.4. vector的增删改查
      • vector 迭代器失效问题(重点)

1.vector的介绍

  1. vector是和数组类似的序列容器,它可以改变大小
  2. 和数组一样,vector用连续的存储器来存储元素,这意味着它存储的元素也可以通过用常规的指针偏移来访问,和数组一样有效率。但是和数组不一样的是,vector的大小可以动态分配,其中它们的存储通过容器来自动解决。
  3. 本质上,vector用一个动态的分配数组来存储它们的元素。这个数组可能需要分配空间,为了增长空间大小,在插入新的元素的时候,这意味着重新申请一个新的数组和拷贝所有的元素到新的数组里面。相对而言,这是一个在时间上开销很大的任务,因此,vector不会在每次都重新开辟空间,当一个元素被添加到容器里面的时候。
  4. 而是,vector容器可能会分配一些而外的存储空间来符合可能的增长,因此这个容器可能有一个实际容量大于严格地需要存储元素大小。不同的库使用不同不同的策略来权衡空间的使用和重新分配,但是在一些情况下,重新分配应该只发生对数大小的增长,以至于插入单个元素在vector的后面,可以保证在常数时间内赋值度内尾插数据
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好

2.vector的使用

vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

2.1. vector的定义(构造函数)

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

2.2. vector iterator的使用

在这里插入图片描述

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

2.3. vector空间增长问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
vector在VS的扩容机制(1.5倍的增长)
在这里插入图片描述
vector在g++的扩容机制(2倍的增长)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4. vector的增删改查

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

vector 迭代器失效问题(重点)

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

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

  1. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。
#include <iostream>
using namespace std;
#include <vector>
int main()
{
    vector<int> v{ 1,2,3,4,5,6 };
    auto it = v.begin();
    // 将有效元素个数增加到100个,多出的位置使用8填充,操作期间底层会扩容
    // v.resize(100, 8);
    // reserve的作用就是改变扩容大小但不改变有效元素个数,操作期间可能会引起底层容量改变
    // v.reserve(100);
    // 插入元素期间,可能会引起扩容,而导致原空间被释放
    // v.insert(v.begin(), 0);
    // v.push_back(8);
    // 给vector重新赋值,可能会引起底层容量改变
    v.assign(100, 8);
    /*
    出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉,
    而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的
    空间,而引起代码运行时崩溃。
    解决方式:在以上操作完成之后,如果想要继续通过迭代器操作vector中的元素,只需给it重新
    赋值即可。
    */
    while (it != v.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;
    return 0;
}
  1. 指定位置元素的删除操作–erase

#include <iostream>
using namespace std;
#include <vector>
int main()
{
    int a[] = { 1, 2, 3, 4 };
    vector<int> v(a, a + sizeof(a) / sizeof(int));
    // 使用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就认为该位置迭代器失效了。

  1. 注意:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    VS中会报错

g++
在这里插入图片描述
在这里插入图片描述
【第一个数组】
在这里插入图片描述
【第二个数组】
在这里插入图片描述

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

在这里插入图片描述

迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

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

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

相关文章

一文全览机器学习建模流程(Python代码)

注&#xff1a;本文基于之前的文章做了些修改&#xff0c;重复部分可以跳过看。示例的项目为基于LR模型对癌细胞分类的任务。 随着人工智能时代的到来&#xff0c;机器学习已成为解决问题的关键工具&#xff0c;如识别交易是否欺诈、预测降雨量、新闻分类、产品营销推荐。我们接…

深入浅出C语言——字符/字符串操作函数

文章目录 一、字符串操作函数1. strlen2. strcpy3. strcat4. strcmp5. strncpy6. strncat7. strncmp8. strstr9. strtok10. strerror二、字符操作函数 一、字符串操作函数 1. strlen size_t strlen ( const char * str );strlen 获取字符串长度。字符串已经 ‘\0’ 作为结束标…

Mybatis二级缓存详解

目录 二级缓存 MyBatis的缓存机制整体设计以及二级缓存的工作模式 二级缓存的划分 使用二级缓存&#xff0c;必须要具备的条件 一级缓存和二级缓存的使用顺序 二级缓存实现的选择 MyBatis自身提供的二级缓存的实现 二级缓存的作用 二级缓存的作用域 二级缓存应用场景…

Pruning 系列 (六)remove剪枝

环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117一、填0与remove剪枝的差异 直接填0的剪枝: 优点: 保留了原始网络结构,便于实现和微调。部分减少模型的计算量。缺点: 零权重仍然需要存储,因此不会减少内存使用。一些硬件和软件无法利用稀疏计算,从而无法提高计算效率…

Linux网络——shell编程之awk编辑器

Linux网络——shell编程之awk编辑器 一、awk编辑器1.概述2.工作流程3.常用选项 二、awk的基础用法1.输出文件中的某一列2.根据特定条件筛选数据3.按照分隔符进行切割4.在匹配到特定字符串时执行操作5.BEGIN打印模式6.awk的分隔符用法 三、示例演示1.获取本机上一次开机时间2.检…

Unity UI -- (1)概览

UI&#xff08;User Interface&#xff0c;用户接口&#xff09;&#xff0c;是让用户和计算机或计算机应用交互的接口系统。 在实时3D项目中&#xff0c;UI通常是由文本、按钮、复选框、滑动条和单选框等组合出来的界面。这些元素使用特定规则或通知和用户进行交互。 UI设计是…

路由信息协议(RIP)

文章目录 1 概述2 RIP 要点2.1 根据 距离矢量&#xff08;或 跳数&#xff09;寻找最佳路由2.2 RIP 三大要点2.3 基本工作过程2.4 路由条目的更新规则2.5 RIPv1 和 RIPv22.6 "坏消息传播慢" 的问题 3 网工软考真题 1 概述 #mermaid-svg-bIbiI8QAnQj8HX7d {font-famil…

Vivado综合属性系列之四 ROM_STYLE

目录 一、前言 二、ROM_STYLE 一、前言 ROM英文全称为Read Only Memory&#xff0c;只读存储器&#xff0c;里面主要存放固定的数据。 二、ROM_STYLE ROM的使用方式与RAM类似&#xff0c;格式样例为&#xff1a;(* rom_style"{distributed | block}" *)&#xff0…

C++类和对象入门

C类和对象入门 1. 面向过程和面向对象初步认识2. 类的引入3. 类的定义3.1 类的两种定义方式 4.类的访问限定符及封装4.1 访问限定符说明 5. 封装5. 类的作用域6. 类的实例化7. 类对象模型7.1 类对象存储规则7.2 如何计算类对象的大小 8. this指针总结 1. 面向过程和面向对象初步…

简述 JavaScript 被执行的那些事情

简述 JavaScript 被执行的那些事情 JavaScript 是脚本语言 JavaScript 是解释型语言 JavaScript 执行流程 不同浏览器有不同的 JavaScript 引擎&#xff08;运行时&#xff09;&#xff0c;主流的 JS 引擎有&#xff1a; V8&#xff0c;chromium 内核的引擎&#xff0c;主…

【ChatGPT4.0+PPT】使用NewBing搭配mindshow快速完成PPT任务

使用NewBing搭配mindshow快速完成PPT任务 前言一、使用NewBing生成PPT大纲二、粘贴Markdown到mindshow生成PPT三、结果展示四、扩展 前言 完成一个简单的PPT只需要两步&#xff1a; 使用NewBing生成PPT大纲粘贴Markdown到mindshow生成PPT 如果访问不了NewBing可以用国内Chat…

Minecraft外置登录服务器Little-Skin讲解

随着Minecraft的普及与发展&#xff0c;现在许多小伙伴是越来越爱上了MC。但是想玩国际正版岂是那么容易&#xff1f;或许你会说“HMCL不就是java启动器吗&#xff1f;”&#xff0c;这句话是没错&#xff0c;但是HMCL的都是离线账户。那么该怎么永远拥有一个稳定的账户呢&…

JVM 垃圾回收相关算法

垃圾标记阶段 对象存活判断: 在堆里存放着几乎所有的 Java 对象实例&#xff0c;在GC 执行垃圾回收之前&#xff0c;首先需要区分出内存中哪些是存活对象&#xff0c;哪些是已经死亡的对象。只有被标记为已经死亡的对象&#xff0c;GC 才会在执行垃圾回收时&#xff0c;释放掉…

简单介绍Qt Quick、QML以及Qt Widgets之间的区别与联系

作者&#xff1a;CCAccept 专栏&#xff1a;Qt Quick 文章目录 前言Qt WidgetsQt Widgets的发展Qt Widgets的优点Qt Widgets的应用场景 QML与Qt QuickQML的发展QML的优点QML的应用场景 总结 前言 之前都是一直在做Qt Widgets的项目&#xff0c;最近由于实验室要求&#xff0…

从零开始,教你如何写出好的品牌策划推广方案

要写出一份好的品牌策划推广方案其实并不难&#xff0c;道叔今天给你分享自己十年来在品牌策划行业内的一个经验干货&#xff0c;希望对你有所帮助。 首先&#xff0c;你要知道的是一份“合格”品牌策划方案需要必备的三个条件&#xff1a; 1、逻辑 品牌策划的逻辑决定了方案…

Vue实战笔记(三) 引入Quill Editor

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲如何在 Vue 中引入 Quill \text{Quill} Quill 1、背景介绍 在前端开发中&#xff0c;富文本编辑器是一个重要的功能组件&#xff0c;方便用户创建和编辑格式丰富的文本内容 目前在市面上有着很多富文本编辑器组件&#x…

chatgpt赋能Python-30_days_of_python

用20行Python写的入门级小游戏:“猜数字”游戏 如果你想了解Python编程语言并开始使用它&#xff0c;那么编写一个短小精简的小游戏是一个不错的起点。在这篇文章中&#xff0c;我们将介绍一个入门级小游戏&#xff1a;猜数字游戏。 该游戏旨在帮助你了解Python命令行输入输出…

QRegion 限制 QPainter 的绘制区域

我有这样一个需求。 有一张图片&#xff0c;这张图片上面被我用不同的颜色画了不同的区域&#xff0c;然后我想选择这张图片中的某一种颜色&#xff0c;只在这种颜色所在的区域内进行绘制或者用橡皮擦擦除这种颜色&#xff0c;而不会影响其他颜色。 看着这个需求的时候&#…

Java【网络原理2】TCP 协议的连接管理机制 : 三次握手和四次挥手到底是怎么回事?

文章目录 前言一、三次握手二、四次挥手总结 前言 &#x1f4d5;各位读者好, 我是小陈, 这是我的个人主页 &#x1f4d7;小陈还在持续努力学习编程, 努力通过博客输出所学知识 &#x1f4d8;如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 &#x1f4d9; 希望我的专栏能够…

让AI来预测一下2023年软考系统分析师案例分析的新技术考点

预测 AI对考试的帮助可能没法雪中送炭&#xff0c;但是也许可以锦上添花。AI的预测新技术考点内容&#xff08;仅供参考&#xff09;如下&#xff1a; 由于我是一个AI模型&#xff0c;无法准确预测未来的技术内容。但是根据当前的发展趋势和历史变化&#xff0c;以下是可能出…