当前位置: 首页 > 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…...

解决企业IT服务管理复杂性的iTop开源CMDB架构实践

解决企业IT服务管理复杂性的iTop开源CMDB架构实践 【免费下载链接】iTop A simple, web based CMDB & IT Service Management tool 项目地址: https://gitcode.com/gh_mirrors/it/iTop 在数字化转型时代&#xff0c;企业面临IT配置信息分散、工单流转低效、资产跟踪…...

Hitboxer终极指南:免费专业解决游戏按键冲突的SOCD重映射工具

Hitboxer终极指南&#xff1a;免费专业解决游戏按键冲突的SOCD重映射工具 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的格斗游戏中因为同时按下左右方向键而无法准确释放必杀技&#xff1f;或…...

Android Studio中文界面完整指南:5分钟快速汉化教程

Android Studio中文界面完整指南&#xff1a;5分钟快速汉化教程 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Android St…...

CircularProgressBar扩展开发:如何基于现有库创建自定义进度条组件

CircularProgressBar扩展开发&#xff1a;如何基于现有库创建自定义进度条组件 【免费下载链接】CircularProgressBar Create circular ProgressBar in Android ⭕ 项目地址: https://gitcode.com/gh_mirrors/ci/CircularProgressBar CircularProgressBar是一个功能强大…...

STK Connectors接口函数全解析:如何用MATLAB脚本自动化你的航天仿真流程

STK Connectors接口函数全解析&#xff1a;如何用MATLAB脚本自动化你的航天仿真流程 航天仿真领域的工作者常常面临一个矛盾&#xff1a;STK提供了强大的轨道计算和场景可视化能力&#xff0c;但手动操作界面进行复杂任务时效率低下&#xff1b;MATLAB擅长处理复杂逻辑和批量计…...

C++ TinyWebServer项目实战:手把手教你用阻塞队列实现高性能异步日志(附完整代码)

C TinyWebServer项目实战&#xff1a;手把手教你用阻塞队列实现高性能异步日志&#xff08;附完整代码&#xff09; 在构建高并发服务器时&#xff0c;日志系统往往成为容易被忽视却至关重要的组件。想象这样一个场景&#xff1a;当服务器每秒处理上万请求时&#xff0c;如果每…...

CVBS转BT656/BT601,能成熟、应用广泛的低功耗视频解码器

GM7150是一款低功耗、9位NTSC/PAL视频解码器&#xff0c;由成都振芯科技股份有限公司生产。该芯片采用CMOS工艺&#xff0c;通过IC总线与PC或DSP相连构成应用系统。它内部包含1个模拟处理通道&#xff0c;能实现CVBS、S-Video视频信号源选择、A/D转换、自动钳位、自动增益控制(…...

词达人自动化助手:终极指南让英语词汇学习效率提升10倍

词达人自动化助手&#xff1a;终极指南让英语词汇学习效率提升10倍 【免费下载链接】cdr 微信词达人&#xff0c;高正确率&#xff0c;高效简洁。支持班级任务及自选任务 项目地址: https://gitcode.com/gh_mirrors/cd/cdr 厌倦了在词达人平台上花费数小时完成重复的词汇…...

基于Unsloth与LoRA的高效大语言模型微调工程化实践指南

1. 项目概述&#xff1a;一个为Unsloth优化的AI开发伴侣 如果你最近在折腾大语言模型&#xff08;LLM&#xff09;的微调&#xff0c;尤其是想在自己的消费级显卡上跑起来&#xff0c;那你大概率听说过或者正在用Unsloth。这个开源库通过一系列巧妙的优化&#xff08;比如融合…...

当我们谈论“防治养”时,我们谈论的是一种生活方式的重构

一、重新审视“健康”的定义在现代生活的快节奏中&#xff0c;健康常常被简化为一个医学指标&#xff0c;或是年度体检报告上的一串数字。然而&#xff0c;当我们谈论肿瘤“防治养”时&#xff0c;我们谈论的远不止于此。这不是三个孤立的概念&#xff0c;而是一个完整的循环—…...