【C++】—掌握STL vector 类:“Vector简介:动态数组的高效应用”

news2025/1/8 4:38:08

文章目录

  • 1.vector的介绍和使用
    • 1.1vector的介绍
    • 1.2 vector的特点
    • 1.3vector的使用
      • 1.3.1vector的定义
      • 1.3.2vector iterator的使用
      • 1.3.3vector 的空间增长问题
      • 1.3.4 vector 的增删查改
      • 1.3.5vector 迭代器失效问题

请添加图片描述

1.vector的介绍和使用

1.1vector的介绍

vector是一个顺序容器,可以看作是能够动态增长和缩小的数组。与普通的数组不同的是,vector在需要时可以自动调整其大小,以容纳新添加的元素。因此vector在使用上更加的灵活和方便,

1.2 vector的特点

1.动态性:vector能够根据需要动态的调整其空间的大小,这使得vector在处理不确定数量的数据时非常有用。
2.随机访问: 与数组类似,vector支持通过下标进行数据的快速访问,这意味着可以在常数时间内访问vector中的任何元素。
3.尾部操作高效:vector尾部添加或者删除数据时非常高效的,因为这些操作在常数时间内就能完成。

1.3vector的使用

1.3.1vector的定义

构造函数说明接口说明
vector()无参构造
vector(size_type n,const value_type& val = value_type())构造并初始化nvalue
vector(const vector& x)拷贝构造
ector(inputlterator first,inputlterator last)使用迭代器进行初始化构造

代码演示:
1.默认构造函数

std::vector<T> v;

 • 创建一个空的 vector,其元素类型为T
 • 初始时,v的大小为0容量也是未定义的(通常为0,具体取决于实现)

2.指定大小的构造函数

std::vector<T> v(n);

 • 创建一个大小为nvector,其元素被默认构造(即调用T())。
 • 如果T是一个类型,并没有默认构造函数,则会编译报错。

3.指定大小和初始值的构造函数

std::vector<T> v(n,val);

 • 创建一个大小为nvector,并使用val初始化每个元素。
 • 这对需要初始化所有元素为相同值的场景非常有用。

4.范围构造函数

std::vector<T> v(first,last);

 • 创建一个vector,并使用迭代器范围[first,last)内的元素来初始化它。
 • firstlast是输入迭代器,它们指向某种容器(数组、另一个vector等)中的元素。
 • 注意: firstlast是左闭右开的,即包含first指向的元素,但不包括last指向的元素。

5.拷贝构造函数

std::vector<T> v2(v1);

 • 创建一个新的vector,它是现有vector   v1的一个副本。
 • 新vector 将包含与v1 相同数量和顺序的元素。

6.移动构造函数(C++11 及以后)

std::vector<T> v2(std::move(v1));

 • 创建一个新的vector,并通过移动v1 的内容来初始化它。
 • 这通常比拷贝构造函数更加高效,因为它可以避免不必要的复制操作。
 • 然而,v1在移动后将处于未定义状态,通常不再包含有效的数据。

7.初始化列表构造函数(C++11 及以后)

std::vector<T> v1 = {val1,val2,val3,...};

或者

std::vector<T> v1{val1,val2,val3,...};

 • 使用初始化列表来创建并初始化一个vector.
 • 这就允许你直接在构造函数中指定要包含在vector中的元素。

1.3.2vector iterator的使用

iterator的使用接口说明
begin + end获取第一个数据位置的 iterator / const_iterator;获取最后一个数据下一个位置的 iterator / const_iterator
rbegin + rend获取最后一个数据的位置的 reverse_iterator;获取第一个为数据前一个位置的 revesr_iterator

请添加图片描述
请添加图片描述

1.3.3vector 的空间增长问题

接口名称接口说明
size获取数据的个数
capacity获取容量大小
empty判断是否为空
resize改变vectorsize
reserve改变vectorcapacity

1.3.4 vector 的增删查改

vector增删查改接口说明
push_back尾插
popop_back尾删
find查找(这个是算法模块实现,不是vector的接口)
insertpos之前插入数据val
erase删除pos位置的数据
swap交换两个vector的数据空间
operator[]像数组一样访问

代码演示:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	//创建一个空的vector
	vector<int> v;

	//增加元素
	v.push_back(10);
	v.push_back(20);
	v.insert(v.begin() + 1,15); //在第二个位置插入15

	// 打印 vector 中的元素
	cout << "Vector after insertions: ";
	for (int i = 0; i < v.size(); ++i) {
		std::cout << v[i] << " ";
	}
	cout << endl;
	
	// 查找元素
	auto it = find(v.begin(), v.end(), 20);
	if (it != v.end()) {
		cout << "Found 20 at position: " << distance(v.begin(), it) << endl;
	}
	else {
		cout << "20 not found in the vector." << endl;
	}

	// 修改元素
	v[1] = 18; // 将第二个元素修改为 18

	// 打印修改后的 vector 中的元素
    cout << "Vector after modification: ";
	for (int i = 0; i < v.size(); ++i) {
		cout << v[i] << " ";
	}
	cout << endl;

	// 删除元素(删)
	v.erase(find(v.begin(), v.end(), 10)); // 删除第一个值为 10 的元素
	v.pop_back(); // 删除末尾的元素

	// 打印删除后的 vector 中的元素
	cout << "Vector after deletions: ";
	for (int i = 0; i < v.size(); ++i) {
		cout << v[i] << " ";
	}
	cout << endl;

	return 0;
}

运行这段代码将输出:

在这里插入图片描述

1.3.5vector 迭代器失效问题

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

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

1.插入操作导致内存重新分配:

  •当向vector中添加元素,且当前容量不足以容纳新的元素时,vector可能会重新分配其内存空间(即分配更大的内存块,并将现有元素复制到新的位置)。这种情况下,所有指向原vector元素的迭代器、指针和引用都会失效。

 •插入操作包括push_backemplace_backinsert等。

2.删除操作:

  •删除元素(使用erase方法)会使指向被删除元素及其之后的元素的迭代器失效。这是因为删除操作会移动后续元素来填补被删除元素的位置。

3.改变vector的大小:

  •使用resize方法改变vector的大小,如果新大小大于当前大小,并导致内存重新分配,那么所有迭代器都会失效。

4.清空vector:

  • 使用clear方法清空vector会使所有的迭代器失效,因为所有元素都被移除了。

如何避免迭代器失效

  • 预留空间: 如果知道将要插入的元素的数量,可以使用reserve方法预先分配足够的空间。这可以减少内存重新分配的可能性,从而避免迭代器失效。

  • 使用返回值: 一些vector成员函数(如inserterase)会返回指向新元素位置或者下一个有效元素的迭代器。使用这些返回值可以避免因操作导致的迭代器失效问题。

  • 重新获取迭代器: 在可能导致迭代器失效的操作后,重新获取迭代器。

示例代码:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v = {1,2,3,4,5};

	//获取初始迭代器
	auto it = v.begin();

	//插入元素,可能导致迭代器失效
	v.insert(v.begin(), 0);

	//使用重新获取的迭代器
	it = v.begin();//重新获取迭代器
	cout << "插入后的第一个元素:" << *it << endl;

	//删除元素,可能导致迭代器失效
	v.erase(it);

	//使用erase的返回值
	it = v.erase(v.begin()); //删除第一个元素,并获取新的迭代器
	cout << "删除后的第一个元素:" << *it << endl;

	return 0;
}

总之,使用 vector 时需要特别注意迭代器的有效性,尤其是在进行插入和删除操作时。通过预留空间、使用函数返回值和适时重新获取迭代器,可以有效地管理迭代器的生命周期,避免潜在的失效问题。

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

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

相关文章

PTE-中间件安全

DOCKER环境&#xff0c;一般是80 8080 8081端口 1 apache位置扩展名解析漏洞 cd vulhub-master/httpd/apache_parsing_vulnerability/ docker-compose up -d 修改一句话的后缀 直接上传 蚁剑 2 CVE-2017-15715 docker-compose stop cd .. cd CVE-2017-15715/ dock…

Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化

全文链接&#xff1a;https://tecdat.cn/?p38224 分析师&#xff1a;Duqiao Han 股票市场是一个复杂的非线性系统&#xff0c;股价受到许多经济和社会因素的影响。因此&#xff0c;传统的线性或近线性预测模型很难有效、准确地预测股票指数的价格趋势。众所周知&#xff0c;深…

【Revit二次开发】创建Ribbon选项卡与带图标的按钮

效果图 创建一个叫做“开发的插件”的选项卡&#xff0c; 选项卡内有一个叫做“Hello”的图标按钮&#xff0c; 点击按钮后运行一个命令&#xff0c; 该命令弹出提示框“Hello Revit!”。 在此示例基础上&#xff0c;可以根据需要替换图标、文字、命令功能。 步骤 安装Revit…

Java面试要点18 - Java运行时多态与编译时多态

本文目录 一、引言二、运行时多态的实现三、编译时多态的实现四、多态与接口五、多态的实际应用六、总结 一、引言 多态是面向对象编程的三大特性之一&#xff0c;它允许我们以统一的方式处理不同类型的对象。Java中的多态分为两种&#xff1a;编译时多态&#xff08;重载&…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…

(Go基础)Go的运行流程步骤与包的概念

1. 快速入门 所有的go开发&#xff0c;都必须存在并包含在某一个包内 .go 是go语言程序的后缀名 1.1 编译 通过使用 go build 命令对该go文件进行编译&#xff0c;生成.exe文件 1.2 运行 运行刚刚生成出来的test.exe文件既可&#xff0c;不过并不不是双击&#xff0c;而是在…

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程

本节我们自顶向下看看大模型的相关概念&#xff0c;了解其基本架构以及从零手撸大模型的基本流程。自从 openai 释放了 chatgpt 后&#xff0c;人工智能就立马进入了大模型时代&#xff0c;我还记得在此之前 NLP 的处理主要依赖于深度学习的 LSTM&#xff0c;GRU 等模型架构。这…

FPGA实现PCIE3.0视频采集转千兆UDP网络输出,基于XDMA+RTL8211E架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案我这里已有的以太网方案本博客方案的PCIE2.0版本 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC数据缓冲FIFO组…

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …

PostgreSQL数据库笔记

PostgreSQL 是什么 PostgreSQL&#xff08;简称Postgres或PG&#xff09;是一个功能强大、可靠性高、可扩展性好的开源对象-关系数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;它以加州大学伯克利分校计算机系开发的POSTGRES版本4.2为基础。 发展历程 起源与发展&a…

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能&#xff0c;只要增加 stripe 属性即可。但是如果有单元格合并的话&#xff0c;这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并&#xff1a;基于表头中的某一列&#xff0c;具有相同值的个数相加进行合…

光伏电站容量计算方法科普

光伏电站的容量计算是设计和评估光伏系统性能的关键步骤。通过了解光伏电站的容量&#xff0c;我们可以预估其发电量&#xff0c;优化系统设计&#xff0c;并确保系统能满足电力需求。本文将详细介绍几种常见的光伏电站容量计算方法&#xff0c;并特别介绍小程序“光伏一点通”…

mysql数据库(五)多表查询

多表查询 文章目录 多表查询一、链表查询1.1交叉连接1.2 内连接1.3 左连接1.4 右连接1.5 全连接1.6 例子 二、子查询2.1 in与not in2.2 any/some2.3 all2.4 比较运算符2.5 exists 三、例子 查询中使用的表如下所示 ------------ | id | name | ------------ | 1 | IT | …

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具&#xff0c;帝国大厦的构建&#xff0c;终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目&#xff0c;就像未来世界里的一台相声表演&#xff0c;有了德纲却无谦&#xff0c;观众笑着遗憾。—— 语出《双城记》作者&…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

淘宝/天猫按图搜索商品:taobao.item_search_img API的奇幻之旅

在这个看脸的时代&#xff0c;我们不仅对人要看颜值&#xff0c;连买东西都要“看脸”了。没错&#xff0c;我说的就是淘宝/天猫的按图搜索商品功能——taobao.item_search_img API。这个功能就像是电商平台的“人脸识别”&#xff0c;只不过它认的是商品的颜值。下面&#xff…

豆包MarsCode算法题:数组元素之和最小化

数组元素之和最小化 问题描述思路分析分析思路解决方案 参考代码&#xff08;Python&#xff09;代码分析1. solution 函数2. 计算 1 2 3 ... n 的和3. 乘以 k 得到最终的数组元素之和4. 主程序&#xff08;if __name__ __main__:&#xff09;代码的时间复杂度分析&#x…

已有账号,重装系统激活office后发现没有ppt,word,excel等

有时候重装系统后&#xff0c;登录windows结果右键没有word,excel等 点击进入office 进入右边的账户 找到设备和订阅 直接下载office 安装后就会出现了