std::vector扩容解析

C++ 容器list和vector 踩坑重点 C++中std::list和std::vector的增长机制存在显著差异。std::list采用双向链表结构,每次添加元素都独立分配节点内存,具有O(1)的常数时间开销,内存分布不连续。而std::vector是动态数组,扩容时需要重新分配内存(通常按倍数增长)并复制/移动现有元素。对于包含指针的类,必须遵循Rule of Three/Five规则。性能优化建议包括:预先reserve()容量、使用移动语义和emplace操作、根据场景选择合适容器。std::vector适合随机访问,std::list适合 阅读详情

STL中的vector扩容原理

  • 新增元素:vector通过一个连续的数组存放元素,如该数组已经存满,需要重新分配一块内存,将原来的数据拷贝到新的内存中,释放之前的内存,然后再插入新的元素;
  • vector的对象被构建的时候,它的capacity是0,当push_back或insert第一个元素后,其capacity变为1;
  • 在对vector进行删除元素时,其capacity是不会发生变化的;
  • Linux下GCC的扩容方式是以2倍扩容的;

代码事例

#include<iostream>
#include<vector>

using namespace std;

int main(int argc, char** argv)
{
  vector<int> datas;
  cout << "vector datas capacoity: " << datas.capacity() << endl;
  for(int i = 0; i < 10; i++){
    datas.push_back(i);
    cout << "vector datas size: " << datas.size() << endl;
    cout << "vector datas capacity: " << datas.capacity() << endl;
  }
    //移除3个元素
    datas.erase(datas.begin()+2, datas.begin()+5);
    cout << "after erase, vector datas size: " << datas.size() << endl;
    cout << "after erase, vector datas capacity: " << datas.capacity() << endl;

  return 0;
}

//输出结果
vector datas capacoity: 0
vector datas size: 1
vector datas capacity: 1
vector datas size: 2
vector datas capacity: 2
vector datas size: 3
vector datas capacity: 4
vector datas size: 4
vector datas capacity: 4
vector datas size: 5
vector datas capacity: 8
vector datas size: 6
vector datas capacity: 8
vector datas size: 7
vector datas capacity: 8
vector datas size: 8
vector datas capacity: 8
vector datas size: 9
vector datas capacity: 16
vector datas size: 10
vector datas capacity: 16
//发现当vector中的数据删除是不会影像其capacity的
after erase, vector datas size: 7
after erase, vector datas capacity: 16

知乎上有一个关于C++ STL的内存扩容:
C++ STL中vector内存用尽后,为啥每次是两倍的增长,而不是3倍或其他数值?

std::vector的源码详解 连续内存 & 三指针模型:理解startfinish是理解一切的基础。sizevscapacitysize是元素个数,capacity是能容纳的元素上限。。push_back的均摊 O(1):得益于倍增扩容策略。中间插入/删除的 O(n):因为需要移动后续所有元素。迭代器失效push_back可能导致所有迭代器失效(扩容时)。insert可能导致所有迭代器失效(扩容时),或至少是插入点之后的失效。erase导致被删除点之后的所有迭代器失效。pop_back只导致指向被删除元素的迭代器失效。 阅读详情

相关推荐

VIO实战前传:手把手教你解读Kalibr双目IMU标定报告与参数应用

本文详细解析Kalibr双目IMU联合标定报告的核心参数与应用方法,涵盖重投影误差分析、IMU误差指标解读、关键变换矩阵原理及VINS-Fusion实战配置。通过手把手教学帮助开发者准确理解标定结果,解决VIO算法落地中的参数配置难题,提升视觉惯性里程计的系统稳定性与精度。

weixin_42699679的博客 331

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

故障转移集群无法连接到节点_Windows 2012系统群集故障转移集群

理论知识很重要!集群和群集是什么意思?其实看到标题可能会感觉有点绕,简单易懂的来说一下:集群,英文名称为Cluster,集群的意思就是将多个系统连接在一起,可以让多台服务器能够像一台服务器那样工作。通常采用集群系统是为了提高系统的稳定性和网络中心的数据处理能力以及服务能力。第二个就是:群集,其实这个概念也不难理解,群集是把多个计算机连接在一起,形成整形,随后可以更好的利用设备资源的一项新...

weixin_39535283的博客 3250

std::vector 的扩容机制#学习记录#

普通数组在传入函数时只是传入了数组的首地址,通过对地址的偏移来实现访问,所以传入普通数组时在函数中无法求得知数组元素个数,即一般还需传入元素个数。计算新的容量,通常是当前容量的两倍或某个固定的增长因子。类型,它是一个动态数组,可以动态增长和缩小,即我们可以动态的输入而不需要预先分配好固定大小。来求得数组元素个数,因为引用并不改变原始对象的性质,而是提供了对原始对象的访问。将原来的元素拷贝到新的内存空间中。)时,你可以使用容器的成员函数,比如。分配新的内存空间,大小为新容量。释放原来的内存空间。

m0_69216414的博客 409

保姆级教程:用OpenCV的calibrateHandEye()搞定机器人手眼标定(附Python代码)

本文详细介绍了如何使用OpenCV的calibrateHandEye()函数完成机器人手眼标定,解决机械臂与相机坐标系对齐问题。教程涵盖从基础原理、数据采集到Python代码实现的完整流程,特别适合需要精确视觉引导的机器人应用开发。通过手眼标定,可确保机械臂准确抓取相机检测到的目标物体。

weixin_33712987的博客 515

C# 【WebService编写调用】

😹 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

只有登上山顶,才能看到那边的风光 1173

c++语言基础:Vector的内存分配方式与扩容规则

vector的内存分配方式与扩容规则

qq_51046087的博客 3612

无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

本工作将 Mid360 激光雷达、Fastlio-SLAM 和 Ego-Planner 集成,实现无人机的环境感知、定位建图和运动规划(仿真过程)—— 胎教级教程。

weixin_45390670的博客 1万+

vector扩容

vector扩容及避免空间浪费

染指流年的博客 1123

【时时三省】tessy 集成测试 总论

序论不积跬步无以至千里,不积小流无以成江海。正文。

时时三省的博客 1147

使用Python爬虫获取Facebook帖子和评论数据

Web爬虫是用于自动抓取网页数据的程序。它通过发送HTTP请求,获取网页的HTML源代码,再对源代码进行解析,提取所需的内容。爬虫常用于数据收集、信息提取、数据分析等应用。

2201_76125261的博客 1998

STL中vector怎么扩容

vector被称为向量容器,该容器擅长在尾部插入或删除元素,时间复杂度为O(1);而对于在vector容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。使用vector容器,需要包含,注意这里无扩展名。STL中规定容器的区间遵循前闭后开原则,即容器中的一对迭代器start和finish标识的前闭后开区间,从start开始,直到finish-1.迭代器finish所指的是“最后一个元素的下一位置”。

m0_51765675的博客 870

【高级雷达感知与学习】 第十三章 可解释性与物理–感知融合(Physics-Informed ML)

本文提出了一种面向雷达感知的物理约束学习方法,将雷达物理先验(RCS、SNR、距离衰减)嵌入神经网络,解决纯数据驱动模型的样本效率低、泛化能力弱和决策不可信问题。通过三种融合范式(混合建模、物理正则化、PINNs)实现机理与数据协同建模,并设计了物理引导显著图解决雷达可解释性语义错位问题。实验表明,物理约束可提升40%样本效率,增强低信噪比场景鲁棒性。代码实现包含物理正则化损失、可解释性分析和消融实验,为雷达感知系统提供了可迁移的工程范本。

VectorShift的博客 185

C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效

如果你问一个 C++ 程序员"最常用的容器是哪个",十个里有九个会回答 std::vector。为什么?连续内存:vector 的元素在内存里紧密排列,就像宿舍楼里连号的房间。这使得它访问第 i 个元素的耗时是 O(1)(常数时间,不随元素数量增长),还能直接获得极高的缓存命中率(CPU 读内存时会把相邻数据一起搬进高速缓存)。动态扩容:C 语言里,数组大小必须在编译期定死;vector 则像伸缩自如的行李箱,装满了会自动变大。STL 算法友好。

ITOfDragon的博客 430

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

std::vector扩容变慢?可能是缺少noexcept移动构造函数在作祟

解决std::vector扩容性能瓶颈,关键在于移动构造函数的 noexcept 说明。当自定义类型未声明noexcept移动构造时,容器扩容会强制调用拷贝而非移动,导致性能下降。本文解析其底层机制与修复方法,适用于高频扩容场景的C++项目优化,值得收藏。

VarIsle的博客 1036

VB摄像头监控

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

C++ 第四阶段 STL 容器 - 第七讲:详解 std::vector 与 std::deque —— 动态数组与双端队列的深度解析

vector 和 deque 是 C++ STL 中的两种顺序容器,各有特点:vector 采用连续内存布局,适合尾部频繁操作和随机访问;deque 采用分块存储,支持两端高效操作。vector 在中间插入/删除时效率较低且扩容开销大,而 deque 避免了频繁扩容但内存不连续。优化建议:vector 应预分配空间,deque 应优先两端操作。典型应用场景:vector 适用于动态数组和随机访问需求,deque 适合队列实现和内存敏感场景。

弘羽 933

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++动态数组原理与std::vector最佳实践

动态数组是计算机科学中基础的数据结构,通过堆内存动态分配实现长度可变的连续存储空间。其核心原理包括内存分配策略、扩容机制和迭代器设计,在C++中通过new/delete运算符或标准库的std::vector实现。相比静态数组,动态数组能更高效地处理未知规模数据,广泛应用于文件处理、网络通信等场景。现代C++推荐使用std::vector配合RAII机制,既保证了内存安全又提供了reserve()、移动语义等优化手段。理解动态数组的内存管理特性对预防内存泄漏和迭代器失效至关重要,是C++开发者必须掌握的核心技

weixin_30552811的博客 487

【C/C++】跟我一起学_深入解析std::vector之性能优化与底层机制

重新梳理vector

YZJincsdn的博客 1349

C++ : std::vector 深度解析

摘要: std::vector 支持下标访问(operator[]),因其元素存储在连续内存中,可直接通过指针偏移实现 O(1) 随机访问。唯一例外是 std::vector<bool>,因其特化实现为位压缩存储,破坏了连续内存特性。底层通过三个指针(首元素、尾后位置、容量末尾)管理动态数组,operator[] 本质是首地址+下标偏移的解引用。连续内存还带来高效缓存局部性、C 接口兼容性及随机访问迭代器等优势。vector 扩容时重新分配连续内存,导致迭代器失效,但始终保证元素连续性。sizeof(std

Mr.Sugarcane 553

C++数组内存模型全解析:从静态数组到std::vector实战指南

数组作为计算机科学中最基础的数据结构,其核心在于连续内存分配与随机访问机制。在C++中,数组分为静态与动态两种实现方式,分别对应栈内存的自动管理和堆内存的灵活分配。理解数组的内存模型对于编写高性能、安全的代码至关重要,特别是在涉及缓存优化和内存管理的场景中。静态数组在编译时确定大小,分配在栈上,访问速度极快但受限于固定大小和栈空间;动态数组则通过new/delete或现代C++的std::vector在堆上分配,支持运行时调整大小。std::vector作为动态数组的封装,通过RAII机制自动管理内存,有效

weixin_34176694的博客 363

c++ STL 006 容器(vector)

类模板原型 class template std::vector template < class T, class Alloc = allocator > class vector; 说明 vector 可以看成是一个动态数组,这个数组是可以动态扩容或者缩减的。 Internally, vectors use a dynamically allocated array to store their elements. This array may need to be reallocate

limonero 472

C++动态数组:从malloc手动管理到std::vector智能容器的深度对比与实战指南

动态数组是C++中处理可变数量数据的核心数据结构,其实现方式深刻影响着程序的性能、安全性与可维护性。从底层原理看,动态数组的本质是在堆上分配连续内存空间,并通过指针算术进行元素访问。传统上,开发者使用malloc/free进行手动内存管理,这要求程序员精确控制内存的申请、扩容与释放,虽然能获得接近硬件的理论性能,但极易引发内存泄漏、悬垂指针等严重问题。现代C++通过RAII(资源获取即初始化)和泛型编程范式,提供了std::vector这样的智能容器,它自动管理内存生命周期,在保证类型安全与异常安全的同时,

weixin_30410119的博客 459

C++ 中 std::vector 原理详解:从内存模型到 resize/reserve 的深度辨析

的核心设计围绕三个指针(startfinishsize是容器中实际存在的元素数量,capacity是已分配内存可容纳的元素数量。始终成立。[0, size)范围的元素是安全可访问的,范围的内存已分配但元素未构造,不应访问。resize(n)改变size,会构造或析构元素,让容器真正拥有n个元素。当需要实际使用这些位置时用resize。reserve(n)仅预分配内存,不改变size,不构造元素。当你知道即将添加大量元素时用reserve避免多次内存重新分配。扩容机制:当时,push_back。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 794

Golang 切片容量(cap)增长探秘

在go 指南, 复习切片的时候,发现切片容量增长在一定范围内并不固定为2倍。 以下内容为全文转载,地址 golangSlice的扩容规则 一段代码 以前一直以为go语言中的slice,也就是切片,其容量增长规则与std::vector一样,指数扩容,每次扩容都增长一倍,没有去详细了解过源代码。直到同事丢给了我以下这段代码: s := []int{1,2} s = append(s,4,5,6) fmt.Printf("%d %d",len(s),cap(s)) ...

米兰的小科比 3310

C++动态数组实战:从手写到vector优化

本文介绍了动态数组的实现原理及其在C++中的实际应用。首先对比了静态数组的高效访问与固定大小的局限性,重点讲解了动态数组的翻倍扩容机制和内存拷贝操作。通过手动实现简易动态数组类,展示了核心扩容逻辑。同时详细解析了STL中std::vector的使用技巧,包括初始化方法、元素访问、容量操作等,并指出了常见使用陷阱。文章强调动态数组通过智能扩容机制解决了静态数组的缺陷,建议读者通过扩展手动实现来加深理解。

wudu_123456的博客 1078

C++ 中的 vector

深入理解 C++ 中最常用的容器 std::vector:动态数组的核心特性、内存管理、扩容机制、迭代器失效问题,以及 reserve、emplace_back 等现代化最佳实践。特别提醒 std::vector<bool> 的陷阱和 C++20 新特性。

B33336的博客 1067
上一篇: 详解softmax和sigmoid
下一篇: 详解卷积神经网络(CNN)
一杯盐水
博客等级 码龄10年 62粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值