【C++打怪之路Lv9】-- vector

news2025/1/16 16:46:32

🌈 个人主页:白子寰
🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

 

目录

什么是vector

vector的特点

vector常用的函数接口

1)构造函数

①默认构造函数,创造一个空的vector容器

②构造一个vector类对象并用n个val初始化

③拷贝构造函数

④使用迭代器进行初始化构造

2)容量操作

①size

②capacity

③empty

④resize

⑤reverse 

3)访问和遍历

①operator[]

②迭代器(正向和反向迭代器)

③at

④front and back

4)vector的增删查改

①push_back

②pop_back

③find

④insert

⑤erase

⑥swap

⑦assign 

⑧clear

什么是迭代器失效

如何避免迭代器失效


 

什么是vector

在 C++ 标准模板库(STL)中,vector 是一种序列容器,表示可以改变大小的数组

它是通过模板实现的,因此可以用于存储任何类型的对象只要这些对象支持拷贝构造函数和析构函数

vector的特点

  1. 动态数组vector 在内部使用一个动态分配的数组来存储元素。当数组满时,vector 会自动重新分配更大的内存空间,并将现有元素复制到新的内存位置。

  2. 连续存储vector 保证所有元素都存储在连续的内存位置中,这使得通过索引访问元素非常高效。

  3. 随机访问:由于元素是连续存储的,vector 支持快速随机访问,时间复杂度为 O(1)

  4. 动态大小vector 可以在运行时动态地增加或减少其大小,这是通过 push_backpop_backinsert 和 erase 等成员函数实现的。

  5. 自动内存管理vector 管理自己的内存,当 vector 被销毁或其大小被减少时,它会自动释放不再需要的内存


vector常用的函数接口

1)构造函数

①默认构造函数,创造一个空的vector容器

vector();

②构造一个vector类对象并用n个val初始化

vector(size_t n, const value_type& val);

创建一个包含 n 个元素的 vector,并且所有元素都是初始值 val 使用 

注:value_type 是 vector 存储元素的类型

③拷贝构造函数

vector(const vector& other);

 创建一个新 vector 作为另一个已存在 vector 的副本使用

④使用迭代器进行初始化构造

template <class InputIterator>
vector(InputIterator first, InputIterator last);

 使用迭代器指定的范围来初始化 vector 时使用,这个范围包括 [first, last) 中的元

注:InputIterator 是一种迭代器类型,它可以是任何能够用于迭代的类型,比如指针或者其它容器的迭代器




 

2)容量操作

①size

size_t size() const;

获取vector中元素个数 

②capacity

size_t capacity() const;

 获取vector当前容量( vector 在不重新分配内存的情况下可以容纳的最大元素数量)

③empty

bool empty() const;

检查vector是否为空 

④resize

void resize(size_t n, value_type val = value_type());

改变vector的大小,多出来的会填充默认值

用来调整 vector 的大小到 n 个元素。

①如果 n 小于当前大小,则删除多余的元素;

②如果 n 大于当前大小,则添加新元素,并用 val 初始化它们

⑤reverse 

void reserve(size_t n);

设置vector的容量 

用来预留至少能够容纳 n 个元素的内存空间。这不会改变 vector 的 size,但会增加其 capacity


 

 



 

3)访问和遍历

①operator[]

reference operator[](size_t n);
const_reference operator[](size_t n) const;

访问vector中的元素 

通过索引 n 访问 vector 中的元素。不检查索引是否有效,因此使用时需确保索引在有效范围内

注:reference 和 const_reference 分别表示对 vector 元素的引用和常量引用

②迭代器(正向和反向迭代器)

iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;

遍历vector中的元素

③at

reference at(size_type n);
const_reference at(size_type n) const;

访问vector中的元素,并提供边界检查

通过索引 n 安全地访问 vector 中的元素。如果索引无效,则抛出 std::out_of_range 异常

④front and back

reference front();
const_reference front() const;
reference back();
const_reference back() const;

front -- 访问vector的第一个元素 

back -- 访问vector的最后一个元素 

[如vector为空,则行为未定义]




 

4)vector的增删查改

①push_back

void push_back(const value_type& val);

在vector的末尾添加一个元素,如果需要,会自动增加 vector 的容量

②pop_back

void pop_back();

删除vector末尾的元素

③find

template <typename InputIterator, typename T>
InputIterator find(InputIterator first, InputIterator last, const T& val);

find查找两个迭代器区间的val值

find不是vector的成员函数 

④insert

iterator insert(const_iterator position, const value_type& val);
iterator insert(const_iterator position, size_type n, const value_type& val);
template <class InputIterator>
iterator insert(const_iterator position, InputIterator first, InputIterator last);

 在迭代器 插入1个 或多个元素 或一个vector类对象


 


 

⑤erase

iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);

⑥swap

void assign(size_type n, const value_type& val);
template <class InputIterator>
void assign(InputIterator first, InputIterator last);

⑦assign 

void assign(size_type n, const value_type& val);
template <class InputIterator>
void assign(InputIterator first, InputIterator last);

  为vector指定新内容

⑧clear

void clear() noexcept;

清空,size为0 



什么是迭代器失效

迭代器的失效是指由于容器的修改操作,使得原有迭代器不再有效无法正确访问容器元素

简单来说:

迭代器失效就像是你拿着指向某个物品的指针,但物品的位置变了,你的指针就找不到原来的物品了

通常发生在以下几种情况:

  1. 容器内存重新分配:当容器如 vector 或 string 因为增加元素而需要重新分配内存时,之前指向容器元素的迭代器、指针和引用会失效。

  2. 容器元素删除:当通过 eraseclear 或 pop_back 等操作从容器中删除元素时,指向被删除元素或被删除元素之后元素的迭代器会失效。

  3. 容器插入操作:在序列容器(如 vectordequestring)中插入元素可能会使插入点之后的所有迭代器失效

如何避免迭代器失效

专业术语:

1、重获迭代器:在容器修改操作后,使用返回的有效迭代器更新现有迭代器。
2、范围删除:使用基于范围的 erase 方法来删除元素,避免单独删除导致的迭代器失效。
3、避免失效操作:了解哪些容器操作会导致迭代器失效,并尽量规避。
简单来讲:

更新指针:当你删除或添加元素后,记得重新获取新的迭代器位置。
一次性清理:如果需要删除多个元素,尽量一次性完成,而不是一个一个删。
别用坏指针:知道哪些操作会让迭代器变坏,就不要在那些操作后继续使用旧的迭代器。
总结

避免迭代器失效的关键在于

操作后更新迭代器,批量处理元素,以及避免使用已失效的迭代器




 

***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“以结果为导向,主动去争取”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

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

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

相关文章

Flink系统架构和应用部署方式

目录 概述 Flink集群架构组件 Client JobManager TaskManagers 算子、Task和Subtask三者关系 概念 算子和Task的关系 Task和SubTask的关系 算子和SubTask的关系 样例 Task Slots和资源的关系 Flink应用程序部署 Flink Session 集群 Flink Job 集群 Flink Appli…

「Java服务」快速接入SkyWalking方法指南

一、背景 背景&#xff1a;Apache SkyWalking 是一个开源的分布式应用性能监控&#xff08;APM&#xff09;系统&#xff0c;主要用于监控微服务、云原生和容器化应用的性能。接入SkyWalking可以排查以智能投放服务为主的服务响应问题 技术架构 SkyWalking 的核心架构包括以…

[含文档+PPT+源码等]精品基于ssm实现的原生微信小程序线上养花系统的设计与实现

基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;实现的原生微信小程序线上养花系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、选题背景 随着人们生活水平的提高和环境保护意识的增强&#xff0c;养花已经成为一种流行的休闲活动。…

UE5 猎户座漂浮小岛 04 声音 材质

UE5 猎户座漂浮小岛 04 声音 材质 1.声音 1.1 导入 wav格式 1.2 循环播放 1.3 mp3转wav 1.4 新手包素材&#xff08;火焰 &#xff09; particle&#xff1a;颗粒 2.材质 2.1 基本颜色 M_Yellow 2.2 混合模式与双面材质 2.3 金属感、高光、粗糙度 M_AluminumAlloy 2.4 自…

【JAVA毕业设计】基于Vue和SpringBoot的课程管理平台

本文项目编号 T 006 &#xff0c;文末自助获取源码 \color{red}{T006&#xff0c;文末自助获取源码} T006&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 数据库设计 六、…

CyberRt实践之Hello Apollo(Apollo 9.0版本)

apollo9.0环境安装参考官方网站 apollo.baidu.com/community/Apollo-Homepage-Document?docBYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0adPgCY%2BADwCiAVnEAhAILiAnABZxEgOzK1Y%2BQA51M3ROUnJBsbK2WZoyUdkBhcXoAMhlwDFlARnUXZdzE9AGY%2BbFINADYpUhCEFW…

(Java企业 / 公司项目)阿里云aliyun-对象存储OSS详细从开通到配置(微服务架构选用)

OSS配置文档 注册阿里云账号 https://www.aliyun.com/ 注册成功登录阿里云。 配置bucket 进入控制台&#xff1a; 搜索OSS 点击上图中控制台“对象存储OSS”&#xff0c;立即创建Bucket: 点击“立即创建”&#xff0c;填写bucket的信息&#xff0c;如下图&#xff1a; 注意…

机器学习拟合过程

import numpy as np import matplotlib.pyplot as plt# 步骤1: 生成模拟数据 np.random.seed(0) X 2 * np.random.rand(100, 1) y 4 3 * X 2 * X**2 np.random.randn(100, 1)# 步骤2: 定义线性模型 (我们从随机权重开始) w np.random.randn(2, 1) b np.random.randn(1)#…

C++11中的原子操作及其底层缓存一致性

C中的原子变量&#xff08;atomic variables&#xff09;是一种并发编程中用于保证数据一致性和线程安全的机制。在多线程环境下&#xff0c;当多个线程同时访问或修改同一个变量时&#xff0c;可能会产生竞争条件&#xff08;race condition&#xff09;&#xff0c;导致未定义…

Javascript 使用 Jarvis 算法或包装的凸包(Convex Hull using Jarvis’ Algorithm or Wrapping)

给定平面中的一组点&#xff0c;该集合的凸包是包含该集合所有点的最小凸多边形。 我们强烈建议您先阅读以下文章。 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspne…

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 二.判…

六、设置弹窗显示队列

实现原理&#xff1a; 把弹窗放置在一个队列中&#xff0c;通过设置UI方法&#xff0c;直接调用这个队列中的文本 Queue是一个先进先出的队列。 一、队列的使用 写一个增加提示的方法 在这里使用锁来执行这个语句&#xff0c;向这个队列里面增加一个提示文本 在这里进行文本…

Llama3-Factory模型部署新手指南

一、介绍 为了保持其公司在人工智能开源大模型领域的地位&#xff0c;社交巨头Meta推出了旗下最新开源模型。当地时间4月18日&#xff0c;Meta在官网上宣布公布了旗下最新大模型Llama 3。目前&#xff0c;Llama 3已经开放了80亿&#xff08;8B&#xff09;和700亿&#xff08;…

报表控件stimulsoft操作:使用 Stimulsoft 产品连接到 Json数据源

我们继续我们的系列文章&#xff0c;介绍如何在 Stimulsoft 产品中连接各种类型的数据源。在上一篇文章中&#xff0c;我们讨论了如何连接 OData。今天&#xff0c;我们将深入研究另一种类型的数据源 - JSON。 Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate…

Bat To Exe Converter软件:将批处理文件bat转换成exe应用程序

Bat To Exe Converter软件&#xff1a; 将批处理文件bat转换成exe应用程序&#xff08;文章最后附软件下载地址&#xff09;Bat To Exe Converter软件可以把批处理文件bat转换为exe可执行文件&#xff0c;甚至运用密码保护文件&#xff0c;生成的.EXE是独立的文件&#xff0c;…

DevExpress WinForms中文教程:Data Grid - 如何点击获取信息?

在使用DevExpress WinForms的Data Grid之类控件时&#xff0c;可能需要实现自定义用户交互&#xff0c;例如显示数据行的上下文菜单&#xff0c;或者在双击一行时调用编辑表单。在这些情况下&#xff0c;您需要在指定的坐标处标识网格元素。 在本教程中&#xff0c;您将学习如…

Python案例 | 使用K-means 聚类算法提取图像中的颜色

假如我们需要提取下图中的颜色&#xff0c;可以通过使用 K-means 聚类算法对图像进行颜色聚类分析&#xff0c;并生成一个基于聚类中心(即最具代表性的颜色)的RGB值和调色板。 # 通过使用 K-means 聚类算法对图像进行颜色聚类分析&#xff0c;并生成一个基于聚类中心(即最具代…

时间序列预测(二)——前馈神经网络(Feedforward Neural Network, FNN)

上一篇文章有提到线性回归方程。 时间序列预测&#xff08;二&#xff09;——前馈神经网络&#xff08;Feedforward Neural Network, FNN&#xff09;-CSDN博客 与线性回归相比&#xff1a; 线性回归只有一个线性层&#xff0c;输入直接映射到输出&#xff0c;不包含隐藏层…

「漏洞复现」灵当CRM data/pdf.php 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…