当前位置: 首页 > news >正文

c++ STL系列——(二)vector

引言

在现代C++编程中,std::vector是最常用的动态数组实现之一,它是C++标准模板库(STL)的一部分。vector提供了一种方式,以单一数据结构来存储元素集合,并且可以动态地调整大小以适应新元素。本文将深入探讨vector的设计理念、特性、使用方法及其优缺点,帮助开发者更好地理解和利用这一强大的工具。

Vector的设计理念

std::vector背后的主要设计理念是提供一种灵活、高效的动态数组实现。与静态数组相比,vector能够在运行时动态地增加或减少容量,同时保持随机访问的特性。vector通过在堆上分配内存并在需要时重新分配更大的内存块来实现动态扩容,从而使得元素的添加操作变得非常灵活。

Vector的核心特性

  • 自动管理内存vector自动管理其存储元素所需的内存。当向vector添加元素,超出其当前容量时,它会自动分配更大的内存空间以容纳新元素。
  • 快速随机访问vector提供了对其元素的快速随机访问,即通过索引直接访问任何元素的时间复杂度为O(1)。
  • 动态调整大小vector可以在运行时根据需要增加或减少其大小,这使得它比静态数组更加灵活。
  • 连续存储vector的所有元素都存储在连续的内存块中,这有利于提高空间和时间局部性,从而提高缓存效率。

使用Vector

基本操作

#include <iostream>
#include <vector>int main() {// 创建一个空的vectorstd::vector<int> vec;// 添加元素vec.push_back(10);vec.push_back(20);// 随机访问std::cout << "第一个元素: " << vec[0] << std::endl;// 使用迭代器遍历for(auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << std::endl;}// 删除最后一个元素vec.pop_back();// 获取vector的大小std::cout << "Vector的大小: " << vec.size() << std::endl;return 0;
}

容量管理

vector提供了多种方法来管理其容量,例如reserve()可以预先分配足够的内存以避免频繁的内存重新分配,而shrink_to_fit()可以请求移除未使用的容量,以节省内存。

注意事项

  • 迭代器失效:向vector添加元素可能会导致存储空间重新分配,进而使得所有指向vector元素的迭代器、引用和指针失效。
  • 性能考虑:虽然vector的元素添加操作通常很快,但如果在vector前面插入或删除元素,则可能导致较高的性能成本,因为这需要移动后续的所有元素。

Vector的优缺点

优点

  • 灵活性vector可以根据需要动态调整大小,非常适合不知道确切元素数量的情况。
  • 高效的元素访问:提供了快速的随机访问能力。
  • 自动内存管理:自动处理内存分配和释放,减轻了程序员的负担。

缺点

  • 可能的内存重新分配:如果频繁地向vector添加元素,可能会引起多次内存重新分配,影响性能。
  • 不适合前端操作:在vector的前端插入或删除元素效率低下,因为这涉及到移动大量元素。

结语

std::vector是C++ STL中一个非常重要和强大的组件,它结合了数组的高效元素访问和链表的动态大小调整的优点。正确地使用vector可以极大地提高编程效率和程序性能。然而,为了最大限度地发挥其潜力,开发者需要理解其内部工作原理和性能特性,以及如何根据具体需求选择合适的操作。希望本文能帮助你更深入地理解std::vector,并在日常开发中有效地使用它。

相关文章:

c++ STL系列——(二)vector

引言 在现代C编程中&#xff0c;std::vector是最常用的动态数组实现之一&#xff0c;它是C标准模板库&#xff08;STL&#xff09;的一部分。vector提供了一种方式&#xff0c;以单一数据结构来存储元素集合&#xff0c;并且可以动态地调整大小以适应新元素。本文将深入探讨ve…...

STM32能够做到数据采集和发送同时进行吗?

STM32能够做到数据采集和发送同时进行吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&am…...

5.Swift常量

Swift 常量 在 Swift 中&#xff0c;除了可以声明变量&#xff08;使用 var 关键字&#xff09;&#xff0c;还可以声明常量&#xff08;使用 let 关键字&#xff09;。常量在赋值后就不能再修改其值&#xff0c;适合用于存储不会改变的数据。以下是关于 Swift 常量的一些重要…...

Linux运行级别 | 管理Linux服务

Linux运行级别 级别&#xff1a; 0关机1单用户2多用户但是不运行nfs网路文件系统3默认的运行级别&#xff0c;给一个黑的屏幕&#xff0c;只能敲命令4未使用5默认的运行级别&#xff0c;图形界面6重启切换运行级别&#xff1a; init x管理Linux服务 systemctl命令&#xf…...

Nginx 配置 SSL证书

成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器。 一、准备材料 SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射。您可以通过DNS验证证书工具&#xff0c;检测域名DNS解析是否生效。具体操作&#xff1a; 【1】登录…...

如何正确理解和获取S参数

S参数是网络参数&#xff0c;定义了反射波和入射波之间的关系&#xff0c;给定频率的S参数矩阵指定端口反射波b的矢量相对于端口入射波a的矢量&#xff0c;如下所示&#xff1a; bS∙a 在此基础上&#xff0c;如下图所示&#xff0c;为一个常见的双端口网络拓扑图&#xff1a;…...

Sping Cloud Hystrix 参数配置、简单使用、DashBoard

Sping Cloud Hystrix 文章目录 Sping Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数C…...

CSS太极动态图

CSS太极动态图 1. 案例效果 我们今天学习用HTML和CSS实现动态的太极&#xff0c;看一下效果。 2. 分析思路 太极图是由两个旋转的圆组成&#xff0c;一个是黑圆&#xff0c;一个是白圆。实现现原理是使用CSS的动画和渐变背景属性。 首先&#xff0c;为所有元素设置默认值为0…...

TI毫米波雷达开发——High Accuracy Demo 串口数据接收及TLV协议解析 matlab 源码

TI毫米波雷达开发——串口数据接收及TLV协议解析 matlab 源码 前置基础源代码功能说明功能演示视频文件结构01.bin / 02.binParseData.mread_file_and_plot_object_location.mread_serial_port_and_plot_object_location.m函数解析configureSport(comportSnum)readUartCallback…...

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…...

算法学习——LeetCode力扣二叉树篇1

算法学习——LeetCode力扣二叉树篇1 144. 二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&a…...

二叉树的遍历及创建

typedef char T;struct TreeNode {T _data;TreeNode* left;TreeNode* right; }; 1、二叉树的遍历---DFS 3 5 6 …...

图形学:Transform矩阵(3维 2维) 平移,旋转,缩放

0. 简介 在图形学领域中&#xff0c;Transform矩阵&#xff08;变换矩阵&#xff09;是一种表示图形对象在二维或三维空间中的位置、方向和大小变化的数学工具。它们用于执行各种图形变换&#xff0c;如平移、旋转、缩放。Transform矩阵通常表示为一个二维或三维矩阵&#xff…...

Docker学习历程

Docker学习历程 Q1、docker还没启动Q2、Docker容器名称冲突的问题Q3&#xff1a;启动minio时发现&#xff0c;容器已经再重启Q4&#xff1a;容器被占用的情况Q5&#xff1a;查看日志 Q1、docker还没启动 docker run --env MODEstandalone --name nacos --restartalways -d -p …...

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…...

前端修炼手册(uniapp的api篇)

一、页面相关API uni.navigateTo 该API用于跳转到应用内的某个页面&#xff0c;可以传递参数。 uni.navigateTo({url: /pages/detail/detail?id1 })uni.redirectTo 该API用于关闭当前页面并跳转到应用内的某个页面&#xff0c;可以传递参数。 uni.redirectTo({url: /pages/…...

JAVA面试题16

什么是Java中的反射机制&#xff1f;它的用途是什么&#xff1f; 答案&#xff1a;Java的反射机制是指在运行时&#xff0c;通过获取类的信息来操作类的属性、方法和构造函数等。它可以用来创建对象、调用方法&#xff0c;以及实现动态代理等功能。 什么是Java中的泛型&#x…...

P1044 [NOIP2003 普及组] 栈题解

题目 有一个单端封闭的管子&#xff0c;将N(1<N<18)个不同的小球按顺序放入管子的一端。在将小球放入管子的过程中也可以将管子最顶上的一个或者多个小球倒出来。请问&#xff1a;倒出来的方法总数有多少种&#xff1f; 输入输出格式 输入格式 输入文件只含一个整数n…...

【DSP】数字信号处理发展里程碑(AI【文心一言】 辅助生成)

在远离尘嚣的学术殿堂中&#xff0c;数字信号处理&#xff08;DSP&#xff09;这一学科犹如一颗璀璨的明珠&#xff0c;其发展历程充满了传奇色彩。下面&#xff0c;就让我们一起穿越时空&#xff0c;回到那些激动人心的时刻&#xff0c;见证数字信号处理从无到有、从弱到强的壮…...

【JavaScript 】finally() 方法和Filter() 方法

JavaScript 中的finally() 方法 finally是 JavaScript 构造中使用的方法try-catch。try它在and阻塞之后执行catch&#xff0c;无论 Promise 是已履行还是已拒绝。该函数的主要作用是执行必要的清理任务并向用户传达消息。一个常见的用例可能是通知用户“您的请求已被处理”&am…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...