数据结构——vector 清晰讲解

【一】 数据结构之Vector 【一】 数据结构之Vector我们这里的数据结构是C++版本的,需要对C++有一点了解 内容大部分来源于网络视频课程,这里推荐观看学堂在线,自主课堂的邓俊辉老师的数据结构课程。 向量是一种抽象数据类型ADT,与数组不同,它提供了很多接口,能够实现更多的功能。如何理解ADT抽象数据类型,看下面这幅图片(图片均来源于学堂在线,引用请标注出处) OK那么Vector给我们提供了哪些接口呢? 接 阅读详情

数据结构 vector:C++ 中的强大动态数组

在计算机编程中,数据结构是一项基础的概念。数据结构是用来存储和组织数据的方式,它们在算法和程序设计中扮演着关键的角色。其中一个最常用的数据结构之一就是 C++ 中的 vector,它是一个强大的动态数组,提供了灵活性和高效性。本文将深入探讨 vector,包括它的基本操作、性能分析、高级应用、最佳实践以及一些案例研究。

什么是 vector?

vector 是 C++ 标准库中的一个容器类,它是一个动态数组,可以根据需要自动扩展大小。与传统的 C 数组相比,vector 具有更多的优势。首先,它可以自动管理内存,无需手动分配或释放内存。其次,vector 具有动态调整大小的能力,因此你可以在运行时添加或删除元素而无需担心数组大小的限制。最重要的是,vector 提供了许多有用的成员函数,如插入、删除、查找和排序等,使其成为一个强大且易于使用的工具。

vector 的基本操作

创建和初始化 vector

在使用 vector 之前,首先需要包含头文件 <vector>,然后可以使用以下方式创建和初始化一个 vector

#include <vector> 
using namespace std; 

vector<int> myVector; // 创建一个整数类型的空 

vector vector<int> myVector2(5); // 创建一个包含 5 个元素的整数 vector,初始值为默认值 (0) 

vector<int> myVector3 = {1, 2, 3, 4, 5}; // 创建一个包含初始值的整数 vector
插入和删除元素

vector 允许在任意位置插入或删除元素。以下是一些示例操作:

myVector.push_back(10); // 在末尾插入元素 10 

myVector.insert(myVector.begin() + 2, 20); // 在第 3 个位置插入元素 20 

myVector.pop_back(); // 删除末尾元素 myVector.erase(myVector.begin() + 1); // 删除第 2 个元素
访问和修改元素

你可以使用下标操作符 [] 或 at() 函数来访问和修改 vector 中的元素:

int value = myVector[2]; // 获取第 3 个元素的值 

myVector[0] = 42; // 修改第 1 个元素的值
大小和容量

vector 提供了 size() 函数来获取元素的数量,以及 capacity() 函数来获取当前内存容量。需要注意的是,vector 可能会分配比实际元素数量更多的内存,以便在添加元素时不需要频繁地重新分配内存。

int size = myVector.size(); // 获取元素数量 

int capacity = myVector.capacity(); // 获取当前容量

vector 的性能分析

了解 vector 的性能非常重要,特别是在处理大量数据时。以下是一些关于 vector 性能的重要观点:

时间复杂度

vector 支持在常数时间复杂度内进行以下操作:

  • 在末尾插入元素
  • 访问元素
  • 修改元素
  • 获取元素数量和容量

但是,插入和删除操作可能需要线性时间复杂度,因为它们可能需要移动其他元素以腾出空间。

与其他数据结构的比较

与数组相比,vector 具有更多的优势,因为它具有动态扩展的能力。与链表相比,vector 在访问元素方面更快,因为它在内存中是连续存储的,而链表需要遍历节点。然而,链表在插入和删除操作上可能更快,因为它们不需要移动元素。

vector 的高级应用

动态扩展机制

vector 的动态扩展机制非常强大,当元素数量超过容量时,它会自动分配更多的内存,通常是当前容量的两倍。这个机制确保了 vector 在插入大量元素时仍然能够保持高效。

自定义分配策略

你可以自定义 vector 的内存分配策略,这对于某些特定的应用场景非常有用。你可以提供自己的分配器类来控制内存的分配和释放方式。

高级应用示例

vector 可以用于各种高级应用,例如多维 vector、图算法、字符串处理等。它是许多复杂算法和数据结构的基础。

vector 的最佳实践

使用 vector 时,有一些最佳实践值得注意:

  • 当需要动态数组时,优先选择 vector。
  • 注意内存管理,不要忘记释放不再需要的 vector。
  • 处理异常情况,如 vector 空间不足时的异常。
  • 使用迭代器进行遍历和操作元素,而不是使用下标操作符。

案例研究

案例一:学生成绩管理系统

假设你正在开发一个学生成绩管理系统,需要存储每个学生的考试成绩。你可以使用 vector 来存储学生对象,每个学生对象包含姓名和成绩。使用 vector 的动态扩展能力,你可以根据需要添加或删除学生,而无需担心固定数组大小的限制。此外,vector 的成员函数可以帮助你快速查找某个学生的成绩,对学生成绩进行排序等操作。

案例二:图算法中的邻接表表示

在图算法中,邻接表是一种常用的表示方法。它使用 vector 来存储每个顶点的邻接节点列表。对于每个顶点,你可以使用一个 vector 来存储其邻接节点的索引。这种表示方法具有灵活性和高效性,可以快速访问和修改图的结构。同时,vector 的动态扩展能力使得在添加或删除顶点时更加方便。

案例三:动态字符串拼接

在某些情况下,你可能需要拼接多个字符串来构建一个更大的字符串。使用 vector 可以方便地实现动态字符串拼接。你可以将每个字符串作为 vector 的元素,然后使用 push_back() 函数逐个添加字符串。最后,你可以使用 std::string 的 join() 函数将 vector 中的字符串拼接起来。这样的设计使得字符串拼接操作更加高效和可维护。

小结

本文详细介绍了 C++ 中的数据结构 vector,它是一个强大的动态数组,提供了灵活性和高效性。

无论是开发学生成绩管理系统、图算法还是进行动态字符串拼接,vector 都是一种强大的工具,可以帮助你解决各种问题。通过熟练掌握 vector 的使用方式和特性,你可以更高效地开发程序,并处理各种数据结构和算法的挑战。

希望本文对你理解和应用 vector 有所帮助。点个赞再走吧~

【每日一记】算法学习3——vector与结构体 vector是STL容器,和数组非常像,但vector可以被理解为动态数组,即会自己分配内存的数组。 阅读详情

相关推荐

数据结构:STL:vector

定义容器和定义变量没什么区别vector<类型名> 变量名;类型可以是int、double、char、struct,也可以是STL容器:vector、set、queue等等。vector数组是一个一维数组,如果定义成vector数组的数组,那就是二维数组。//二维变长数组。

pancodearea的博客 1925

vector数据结构

/*1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。 另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。 2.list数据结构 list是由双向链表实现的,因此内存空间是不连续的。 只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n); 但由于链表的特点,能高效地进行插入和删

qq_40078576的博客 1873

AI人工智能全模态大模型架构:推动智能交通发展的架构设计

本文旨在阐述全模态大模型在智能交通领域的架构设计原理和应用方法。我们将探讨如何利用多模态AI技术解决交通流量预测、事故预警、路线优化等关键问题。文章将从基础概念入手,逐步深入技术细节,最后探讨实际应用和未来发展方向。全模态大模型:能够处理和理解多种数据模态(如图像、文本、语音等)的大型AI模型智能交通系统(ITS):利用先进技术优化交通流量和安全性的综合系统多模态融合:将不同数据源的信息整合处理的技术核心概念回顾全模态大模型是能够处理多种数据类型的强大AI系统。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 834

数据结构与算法之-----向量(Vector)

本章的主要内容:数据结构之-----向量 数据结构中最基础也是最重要的一个数据结构----向量。笔者大学所学的数据结构貌似与当前流行的学习内容有些不同,如果将数据按逻辑结构来简单划分的话,可以分为线性结构和非线性结构,线性结构里有一个顺序表的概念,其实,您可以把向量看成是顺序表的实例,下面我们来看向量的C++实现: 先来看头文件,头文件中的内容非常之多,基本囊括了向量中大部分的知识,包括多种查询算法,插入算法,删除算法等等,为了代码的高可用性,笔者使用了模版类,如果...

易果啥笔的博客 2393

PX4固件下VTOL固定翼的3种起飞方式对比:手抛vs弹射vs跑道

本文深度解析PX4固件下VTOL固定翼的三种起飞方式:手抛、弹射与跑道起飞,对比其技术差异与适用场景。通过详细的参数配置和工程实践指南,帮助开发者优化起飞性能,提升无人机在不同环境下的适应性和可靠性。文章特别针对PX4飞控系统的最新特性进行了技术探讨。

weixin_30296405的博客 87

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

【算法通关指南:数据结构和算法篇 】顺序表相关算法题 :1.询问学号,2.寄包柜,3.合并两个有序数组

这篇文章介绍了三个与顺序表相关的算法题目: 询问学号 题目要求学生查询指定位置的学号,通过数组或vector直接存储学号实现快速查询,时间复杂度O(1)。 寄包柜 题目需要处理不定大小的二维数据,利用vector动态扩容特性解决传统数组空间不足的问题,通过resize实现按需分配。 合并有序数组 使用双指针法和辅助数组temp,依次比较两个数组元素并按序合并,最后将结果复制回原数组,时间复杂度O(m+n)。 文章强调算法竞赛中时间效率优先的思路,提供了数组和vector两种实现方式,并通过图示和代码注释帮助

小龙报的博客 1347

极验验证码: 一点即过验证(鼠标轨迹分析)

2、第一个验证接口分析(第一个w值还原) 3、第二个验证接口(第二个w值还原)这里定位w生成跟上篇文章一样,就不展开了;主要分析tt值(鼠标轨迹)的生成逻辑

qq_49268524的博客 1009

qmlcanvas绘制3d图形_图形学笔记-01-导论

Fundamentals of Computer Graphics, 4th Edition 这本书从算法和数学方面,介绍计算机图形学。而计算机图形学在很多领域都有相关应用,例如游戏开发,大量地使用计算机图形学,用于渲染各种漂亮的效果。计算机硬件发展很快,而图形学涉及到各种不同硬件平台的API。但是这本书,将尽量不依赖于特定的API,从基本原理上,去介绍图形学相关的知识。1. 主要应用游戏动漫视觉...

weixin_39833290的博客 301

MOS管基础知识及应用电路Multisim仿真

本文系统介绍了MOS管的基础知识及其在电子电路中的典型应用。首先详细解析了MOS管的基本结构、分类和工作原理,包括NMOS、PMOS及CMOS的特性差异。重点阐述了MOS管的三种放大组态电路(共源、共漏、共栅)及其小信号模型分析。随后通过Multisim仿真验证了MOS管在防反接电路、开关电路、放大电路、逻辑门电路、电平转换电路和开关电源(BUCK、BOOST、BUCK-BOOST)等应用中的实际表现。文章还深入探讨了自给偏压和分压式偏置电路的设计要点。全文通过理论分析与仿真实验相结合的方式,全面展示了MO

XU157303764的博客 1482

使用Python爬取在线图书馆的图书馆藏和阅读记录

通过使用Python编写爬虫程序,我们可以从在线图书馆上获取图书馆藏和阅读记录,帮助人们更好地管理和利用图书馆资源。本文简要介绍了爬虫程序的准备工作、网页解析和数据提取、数据的保存和处理的关键步骤,并提供了一个示例代码。在实际应用中,我们需要注意遵守在线图书馆的使用规则和爬虫道德准则,确保合法、合规地进行爬取操作。以上仅为概述,实际应用的过程中可能需要根据具体需求进行适当的调整和改进。

2201_76125393的博客 729

C++:vector删除和增加元素,vector操作简洁清晰

一、简介 Vector就是线性数组的一种抽象和泛化,它也是由具有线性次序的一组元素构成的集合。 二、vector类的成员函数 1. 增加 (1)从最后添加 vector<char> alphabet; alphabet.push_back('A'); // 或者 alphabet.emplace_back('A'); (2)从某个位置插入 alphabet.insert(alphabet.begin(),'B'); //或者alphabet.emplace(alph..

JacksonKim的博客 1万+

RK3568平台(网络篇)WIFI模块RTL8821CU调试

RTL8821CU是瑞昱半导体推出的usb接口的wifi,下面的教程将介绍如何将RTL8821CU移植到rk3588的平台上。移植usb wifi需要修改的文件Android hal层需要修改的文件//kernel需要修改的文件kernel/arch/arm64/boot/dts/rockchip/rk3399-tve1030g.dtsi //除去板上的sdio的wifi。

weixin_49303682的博客 3903

c++数据结构——vector

一:基本函数 vector<int>v; 定义一个名字是v类型为int的数据结构 v.push_back 从尾部插入 v[i] 下标为i的元素 vetcor<int>::iterator it; 类型为vector的迭代器 v.begin() 开始 v.end() 结束 v.front() 首元素 v.back() 末元素 v.clear() 全部清空 v.empty() 是不是空的,是空的返回1,不是返回0 v.size() 元素个数 输出v所有元素有两..

yyf525的博客 503

codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案

本文主要介绍了在使用codex过程中出现Reconnecting和stream disconnected before completion: stream closed before response.completed的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【STL】vector的实现原理

一、概述 vector的数据安排以及操作方式与array极为相似,两者的不同主要在于空间运用的灵活性。array是静态空间,一旦存满,就得分配更大的空间,所有琐碎的操作都得客户自己完成。而vector是动态空间,内部可以自行扩充,容纳新元素。 vector的实现技术,关键在于其对大小的控制以及重新分配时的数据移动效率。本章所采用vector版本为 SGI STL 2.91版本。 二、vector定义摘要 以下是vector部分定义的代码摘录。 _Alloc是SGI STL的空间配置器,具体详见【STL】空间

qq_43142509的博客 986

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java中List接口的实现类 ArrayList,LinkedList,Vector 的区别

java中List接口的实现类 ArrayList,LinkedList,Vector 的区别概要学习方法 概要 学习完数组、链表、栈这三个数据结构之后,再来看下Java中有序集合List的常用实现类使用什么数据结构实现?以及各类之间有什么区别?实际应用场景中怎么选取合适的类。首先让大致看下Java平台提供的集合框架图,对类的继承和实现有个大致印象。 学习方法 在jdk文档查看某个类的介绍和有哪些方法实现,在IDE中点击查看某个方法的具体实现。 ...

izhouxiaofei的博客 518

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java对于数据结构以及集合的实现(个人复习向)

对于常见数据结构的一些知识性理解以及集合,泛型的知识内容补充

Dublinercc的博客 972

JDK集合类源码 || 一、ArrayList,Vector,Stack

文章目录前言一、ArrayList概述底层数据结构增删改查 前言 这一系列是对程序员江湖博主LXF - Java集合类专题的整理。因为原文虽然讲解的很全面透彻,但是组织结构不清晰,而且错别字较多,所以我重新整理,便于自己阅读理解记忆。 这一章转自:https://h2pl.github.io/2018/05/08/collection1/ 本文详尽地介绍了Java中的三个集合类:ArrayL...

qq_40283353的博客 251

Java-----ArrayLIst,vector,LinkedList集合源码解析

Java-----ArrayLIst,vector,LinkedList集合源码解析 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组。线程不安全 LinkedList 底层数据结构是链表。线程不安全 Vector 底层数据结构是数组。线程安全 这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~ 看这篇文章之前最好是有点数据结构的基础:Java实现单向链表,栈和队列就是这么简单,二叉树就这么简单

Old丶X 301

C++学习之旅【C++Vector类介绍—入门指南与核心概念解析】

C++ Vector类详解 摘要 Vector是C++标准库中最重要的动态数组容器,完美解决了普通数组的三大痛点:固定大小、手动内存管理、功能单一。它具有以下核心优势: 动态扩容:自动调整容量,无需预定义大小 高效访问:连续内存布局,支持O(1)随机访问 内存安全:自动管理内存,避免泄漏风险 接口丰富:提供size()/empty()/clear()等便捷方法 学习价值:掌握vector等于掌握STL80%的核心用法 Vector底层通过动态数组实现,扩容时采用"申请新空间→元素迁移→释放旧空间&

承于所学,探技术之渊;以代码求政,寻成长之道。 1497

C++ STL实战:从评委打分案例掌握vector、sort与accumulate高效应用

在C++编程中,标准模板库(STL)是处理数据集合与算法的核心工具。其设计遵循数据与算法分离的原则,通过迭代器作为桥梁,实现容器与算法的解耦与高效协作。这一设计极大地提升了代码的复用性、安全性与表达力,是编写现代化C++代码的基石。从工程实践角度看,STL能显著减少手动管理内存和实现基础算法的负担,让开发者更专注于业务逻辑。例如,在数据处理、游戏开发、工具软件等场景中,对一组数据进行存储、排序、统计是常见需求。本文以经典的评委打分场景为例,深入解析如何组合使用vector容器、sort排序算法与accumu

weixin_30268921的博客 350

C++ vector实战:从矩阵乘法题解析动态数组与算法实现

在C++编程中,动态数组是处理可变规模数据的基础数据结构,其核心价值在于提供灵活的内存管理和高效的随机访问能力。vector作为STL中最常用的动态数组容器,通过自动内存分配与释放,有效避免了原生数组的固定大小限制和手动内存管理的复杂性。从技术原理看,vector在内存中以连续块存储元素,这不仅保证了O(1)时间复杂度的索引访问,还通过预留空间和动态扩容机制平衡了性能与灵活性。在算法与工程实践中,vector常用于实现矩阵运算、图的邻接表存储以及动态规划中的状态表,是连接数学抽象与代码实现的关键桥梁。本文以

weixin_31742871的博客 279

集合之List的源码分析(ArrayList、LinkedList、Vector)

11111

qq_35599414的博客 118

c++ STL相关内容,读完文章可以对STL有清晰的了解

传入的对象是什么类型那么迭代器所指向的就是什么// 此时 v 为vector所传入的类型 即 Person*public:{}int m_Age;public:it!= s1.end();it++)// 自定义数据类型都会指定排序规则printS(s1);

weixin_45560920的博客 1319

一起学习PHP中的DS数据结构扩展(二)

一起学习PHP中的DS数据结构扩展(二)上文中我们学习了 DS 扩展中一些比较常用的数据结构,也留下了一些伏笔,比如 Map 中返回 keys() 和 values() 分别返回的是两种特...

硬核项目经理 250
上一篇: 线段树详解
下一篇: 探讨高精度问题:能否用__int128一统江湖?
VINTAGE_vector
博客等级 码龄5年 213粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值