深入理解C++ vector容器:动态数组的终极指南

c++中的vector动态数组 vector可以简单理解为STL(标准模版库)提供的功能强大的动态数组,vector不只是用来储存整型、浮点型等数字,还可以储存字符、字符串、结构体甚至是类等等。vector可以存储一系列类型相同的元素,因此,称vector为动态系列容器更加合适。提示:以下是本篇文章正文内容,下面案例可供参考以上就是vector容器的介绍以及一些简单的使用方法了,如要更深入了解vector类,可以参考《C_Primer_Plus_第六版》 阅读详情

一、什么是vector?

在C++标准模板库(STL)中,vector是最常用的序列式容器之一。它本质上是一个能够动态调整大小的数组,完美解决了传统C风格数组的固定大小限制问题。通过自动内存管理、高效的元素访问和灵活的大小调整,vector已成为现代C++开发中不可或缺的工具。

传统数组 vs vector

// C风格数组
int arr[5] = {1,2,3,4,5};

// vector容器
vector<int> vec = {1,2,3,4,5};

优势对比:

  • ✅ 动态扩展(无需预先确定大小)
  • ✅ 自动内存管理
  • ✅ 丰富的成员函数
  • ✅ 安全的边界检查(可选)
  • ✅ 与其他STL算法完美兼容

二、基本使用方法

1. 创建vector

#include <vector>

// 空vector
vector<int> v1;

// 指定初始大小
vector<double> v2(10); // 10个0.0

// 初始化列表(C++11)
vector<string> v3 = {"apple", "banana", "cherry"};

// 自定义初始值
vector<char> v4(5, 'A'); // 5个'A'

2. 元素操作

// 添加元素
vec.push_back(10);       // 在末尾添加(拷贝构造)
vec.emplace_back(20);    // 更高效的直接构造(C++11)

// 访问元素
cout << vec[0];          // 无边界检查
cout << vec.at(1);       // 带异常抛出的安全检查

// 删除元素
vec.pop_back();          // 移除最后一个元素
vec.erase(vec.begin()+2);// 删除第三个元素

3. 遍历方式

// 传统下标遍历
for(size_t i=0; i<vec.size(); ++i){
    cout << vec[i] << " ";
}

// 迭代器遍历
for(auto it = vec.begin(); it != vec.end(); ++it){
    cout << *it << " ";
}

// 范围for循环(C++11)
for(const auto& num : vec){
    cout << num << " ";
}

三、核心特性解析

1. 动态扩容机制

vector采用动态数组实现,当容量不足时会自动执行:

  1. 申请更大的内存空间(通常是当前容量的2倍)
  2. 拷贝原有元素到新空间
  3. 释放原有内存
vector<int> vec;
cout << "初始状态: " << vec.size() << "/" << vec.capacity() << endl;

for(int i=0; i<100; ++i){
    vec.push_back(i);
    cout << "添加元素" << i << ": " 
         << vec.size() << "/" << vec.capacity() << endl;
}

2. 容量管理

vector<int> vec;

// 预分配内存(避免多次扩容)
vec.reserve(1000);  // capacity >= 1000

// 调整大小
vec.resize(500);    // size=500,新增元素初始化为0

// 释放多余内存(C++11)
vec.shrink_to_fit();

3. 时间复杂度

操作时间复杂度
随机访问O(1)
尾部插入/删除O(1)
头部插入/删除O(n)
中间插入/删除O(n)
查找O(n)

四、高级技巧与最佳实践

1. 高效初始化(C++11+)

// 移动构造
vector<string> createVector(){
    vector<string> temp{"a", "b", "c"};
    return temp; // 触发移动语义
}

// 使用emplace避免临时对象
vector<Person> people;
people.emplace_back("Alice", 25); // 直接构造

2. 迭代器失效问题

当发生扩容操作后,原有迭代器会失效:

vector<int> vec{1,2,3};
auto it = vec.begin();

vec.push_back(4); // 可能导致扩容
// 此时it可能失效,继续使用会导致未定义行为

3. 自定义分配器

// 使用内存池分配器
#include <memory>
vector<int, MyCustomAllocator<int>> customVec;

五、性能优化建议

  1. 预分配原则:在已知元素数量时,先用reserve()预分配内存
  2. 优先选用emplace:避免不必要的拷贝操作
  3. 批量操作算法:使用STL算法提高效率
    // 高效批量插入
    vector<int> source{4,5,6};
    vec.insert(vec.end(), source.begin(), source.end());
    
  4. 选择适当容器:频繁在头部插入时考虑deque,需要快速查找考虑set/map

六、适用场景分析

✅ 推荐使用:

  • 需要随机访问元素
  • 频繁在尾部添加/删除元素
  • 元素数量变化较大
  • 需要与其他STL算法配合使用

❌ 不推荐使用:

  • 频繁在头部/中间插入删除
  • 元素数量固定且已知
  • 需要快速查找(考虑unordered_set/map)

总结

vector凭借其出色的性能和易用性,在C++开发中占据重要地位。通过合理利用其特性,开发者可以编写出既高效又安全的代码。掌握vector的底层机制和使用技巧,是每个C++程序员进阶的必经之路。

“C++程序员应该像画家熟悉画笔一样熟悉vector容器。” - Bjarne Stroustrup

希望本文能帮助您全面掌握vector的使用技巧。如果您有任何问题或建议,欢迎在评论区留言讨论!

深入理解 C++ 中 std::vector 和 std::set 容器的使用 std::vector 适用于需要频繁进行随机访问和在末尾快速插入删除元素的场景,而 std::set 则更擅长处理需要元素唯一性和有序性的情况,如数据去重和集合运算等。当向向量中添加元素时,如果当前元素个数等于容量,std::vector 会自动重新分配一块更大的内存空间,并将原有的元素复制到新的内存区域,然后再添加新元素。在上述代码中,首先使用 std::set 来标记 instpt 中的元素,然后遍历 ve3,将其中不重复的元素添加到结果向量,并同时标记这些元素。 阅读详情

相关推荐

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

C++STL容器(一)——vector扩容和回收

面字节被问了这个问题,当时没有答上来,现在自己学习了一下做个总结 文章目录一、求容器大小的方法二、扩容的方法三、resize 和 reserve 方法1. resize()2. reserve()四、1.5倍扩容 vs 2倍扩容1. 2倍扩容2. 1.5倍扩容五、容器的回收 一、求容器大小的方法 vector<int> vc; // 定义一个 int 类型的动态数组 vc vc.size(); //返回当前 vc 元素的个数。 vc.capacity(); //返回当前 vc 中最大能够存储.

hhhcbw的博客,欢迎各位来访 7661

告别重复劳动:用Python+pywinauto打造你的微信个人助理(自动回复/收款/定时发消息)

本文介绍如何利用Python和pywinauto库构建微信个人助手,实现自动回复、定时消息、智能收款等功能,告别重复劳动。通过详细的代码示例和配置指南,帮助开发者快速掌握微信自动化技术,提升工作效率。

weixin_42568801的博客 330

C++STL的vector扩容原理及实现

C++的STL中vector的扩容思想及实现 原理 C++的STL库中的vector,是一种使用很频繁的容器,因为它是一个自动扩容的容器,使用起来比较灵活,可以一直往容器的末尾添加数据。 那么它是怎么实现自动扩容的呢?其实关键点就是对于容器里的元素数量进行判断,当容器的存储数量已经达到容量时,那么就需要进行一个倍增扩容了。整体的一个扩容流程为:申请新的内存空间(空间大小为原空间的两倍或一点五倍)—> 把原空间的元素拷贝到新的空间里 —> 释放原空间 —> 数组指针指向新空间。 实现 vec

qq_45622081的博客 5305

VM与欧姆龙PLC通讯设置实战:Fins TCP/UDP协议详解

本文详细解析了VM(VisionMaster)与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战设置。内容涵盖网络配置、协议选择(TCP可靠性与UDP实时性)、VM端地址映射与数据点添加、以及数据接收解析流程,并提供了常见错误排查与高级调试技巧,帮助视觉与自动化工程师快速实现稳定可靠的工业通讯集成。

weixin_29172963的博客 329

【2025CVPR】基于脉冲神经网络的能效目标检测模型:Multi-scale Spiking Detector(MSD)深度解析

本文提出了一种创新的多尺度脉冲神经网络目标检测器(MSD),通过生物启发的ONNB模块和MSDF框架实现了高效准确的目标检测。该模型采用端到端直接训练策略,在COCO数据集上达到62.0%mAP的精度,同时仅需7.8M参数和6.43mJ能耗,较传统方法提升2.8%精度并降低82.9%能耗。实验验证了其在小目标检测和事件数据处理的优越性,为边缘计算应用提供了新范式。

hasakie的博客 1109

面试题:C++vector的动态扩容,为何是1.5倍或者是2倍

文章目录一、概述二、 高效使用vector,避免扩容1.扩容机制回顾2.如何避免扩容导致效率低三、为什么选择以倍数方式扩容1. 以等长个数进行扩容2. 以倍数方式进行扩容3. 为什么选择1.5倍或者2倍方式扩容,而不是3倍、4倍四、Windows和Linux的扩容底层原理1.Windows扩容底层2.Linux的扩容底层五、总结 一、概述 在面试时vector的扩容问题会经常被问到,比如: vector是如何进行扩容的? 扩容会导致效率低下,那如何避免动态扩容呢? 为什么选择以1.5倍或者2倍方式进行扩容

森明帮大于黑虎帮的博客 2万+

告别时钟树平衡噩梦:在Innovus中巧妙设置stop/ignore pin来优化分段时钟网络

本文深入探讨了在Innovus工具中利用stop/ignore pin优化分段时钟树网络的高阶技巧。针对数字IC后端设计中的时钟树平衡难题,详细解析了特殊引脚属性的战略应用场景和配置方法,帮助工程师有效解决SoC设计中复杂的时钟结构问题,显著提升时序收敛效率。

weixin_30836759的博客 290

C++ 自定义STL容器的内存分配器(map、set、vector、string、unordered_map、unordered_set)

使用 C++ 11/14 标准以上应注释下述代码并恢复上述被注释的代码,即设置编译器选项标准为:-std=cxx1z、-std=cxx2a。当然你可以选择判定编译器宏:__cplusplus。

liulilittle的博客 1034

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

JS逆向-7881游戏平台Lb-Sign参数和Lb-Timestamp参数

本文是该专栏的第79篇,后面会持续分享python爬虫干货知识。本文以7881游戏平台为例,通过JS逆向获取它的lb-sign参数和lb-timestamp参数生成规律。针对lb-sign和lb-timestamp两个参数具体的“逆向”思路逻辑,笔者将在本文进行详细说明,并且将在正文结合“完整代码”来详细介绍。废话不多说,具体细节部分以及详细思路逻辑,跟着笔者直接往下看正文部分。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 1220

vector扩容

扩容原理 vector以连续的数组存放数据,当vector空间已满时会申请新的空间并将原容器中的内容拷贝到新空间中,并销毁原容器 存储空间的重新分配会导致迭代器失效 因为分配空间后需要进行拷贝,编译器会预分配更多空间以减少发生拷贝影响程序效率 扩容的大小叫做扩容因子,扩容因子由编译器决定,VS的扩容因子为1.5,G++中,扩容因子为2 vector<int> v = { 1,2,3,4,5,6 }; cout << v.capacity()<<' '; v.pu

一位菜鸡的博客 1345

【PINN高级教程】范式融合与前沿应用 第5讲:贝叶斯推断与生成式建模的深度融合

正规化流(Normalizing Flow, NF)通过一系列可逆变换把简单分布映射为复杂后验,从而获得更好的表达能力。算子学习保持映射的物理正确性。贝叶斯推断给出了自然的框架,但直接对高维函数空间做采样(如 MCMC)几乎不可行。1️⃣ 在自己的 PDE 上跑一遍完整的 Bayesian PINN 流模型。的学习机制深度融合,以在保持物理一致性的前提下,高效地从后验分布中采样。2️⃣ 将每个 θ 直接映射到 FNO 权重,得到不同解的采样。的后验 p(θ∣x,y)p(θ∣x,y) 进行近似。

u012133341的博客 474

【C++】手动实现C++ vector容器:深入理解动态数组的工作原理

通过对各个函数的详细解析,我们手动实现了一个简化版的vector,展示了 C++ 标准库中vector的核心功能。希望通过这篇文章,大家能更好地理解vector容器。

weixin_74837455的博客 2931

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入理解C++中vector容器的原理,史上最详细的实现vector容器的教程,一文手把手带你实现自己的vector容器(包含迭代器的实现)

本文详细介绍了如何从零开始用c++自己手写一个std::vector容器,并对标准库中的vector的大部分功能做出了实现。通过阅读本篇文章,你可以对vector容器有更加深入的了解,并且通过自己实现一个vector也可以有效提升自己的c++编码水平。

greatming666的博客 3778

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【C++】STL容器之vector

前言 C++引入了面向对象的思想,相比于C语言,一个类能更好地对一些数据结构进行管理和操作。 在C语言中,我们使用定长数组和malloc出来的动态数组来维护一段连续的相同类型数据的集合 在C++中,基于面向对象的思想,用来管理空间上连续的同类型数据集合的类便应运而生,从本质上讲,vector类就是一个被封装了的大小可变数组的序列容器 目录 1.vector的简介 2.vector的常见接口及模拟实现     2.1 vector类对象的常见构造  &

DanteKing的博客 1540

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入理解与应用C++ Vector

带你具体剖析vector从底层到使用,成为vector高手

2301_77754590的博客 1882

19. C++STL 5(深入理解vector,vector的模拟实现,二维动态数组)

C++STL中vector的深入理解和模拟使用,使用vector定义二维数组

yzc的博客 1105

深入理解C++ STL中的 vector

通过掌握 vector 的使用和原理,C++ 开发者可以更高效地编写出灵活且高性能的代码。

酷酷的崽的博客 2111

深入理解C++ 中的vector容器

vector 是表示可变大小数组的序列容器。它采用连续存储空间来存储元素,这使得我们可以像操作数组一样,通过下标高效地访问元素。与普通数组不同的是, vector 的大小能够动态改变,容器会自动处理内存管理相关事宜。从本质上讲, vector 使用动态分配数组来存储元素。当新元素插入时,如果当前空间不足,它会分配一个新的数组,并将全部元素迁移到新数组中。虽然这个过程相对耗时,但 vector 并非每次插入新元素都进行这样的操作,以平衡效率。

nplplus的博客 1280

带你深入理解STL之Vector容器

C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便。STL实现了一个Vector容器,该容器就是来改善数组的缺点。vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮

ZeeCoder 4264

动态数组:vector容器

vector容器

m0_60492395的博客 474

C++第二十弹---深入理解STL中vector的使用

vector介绍,构造函数,赋值重载,容量操作,遍历,增删改操作~~~

小林熬夜学习编程的博客 1537

【c++深入系列】:万字详解vector(附模拟实现的vector源码)

想要学到STL的vector容器,看这一篇文章就够了!

努力努力再努力wz的博客 1444

C++ STL vector容器详解:从原理到实践

想象一下,你正在收集各种小玩具,但不确定最终会有多少个。用普通数组的话,你得提前决定一个上限,太小了不够用,太大了又浪费空间。这时候,vector就像一个神奇的收纳盒,它能根据你放入的玩具数量自动调整大小!动态数组:vector是一个能够存放任意类型的动态数组连续内存:vector中的元素在内存中连续存储,支持高效的随机访问自动扩容:当空间不足时,vector会自动分配更大的内存空间类型安全:通过模板机制确保类型安全int age;

m0_74319933的博客 2210
上一篇: C++中的文件与流:深入探索
下一篇: 掌握C++核心数据结构:从基础到实战的全面指南
code19980507
博客等级 码龄2年 318粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值