【std::vector】size、capacity小结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • 一、核心比喻(快速理解)
      • 二、正式定义与特点
        • 1. size(大小)
        • 2. capacity(容量)
      • 三、实例演示(直观看到变化)
      • 四、关键机制:vector的扩容原理
      • 五、易混淆的`resize`和`reserve`(结合size/capacity)
      • 六、总结关键点

在C++的vector中,size(大小)capacity(容量)是两个核心概念,对应vector底层动态数组的元素数量内存空间上限,理解它们的区别和联系是高效使用vector的关键。下面用通俗比喻+定义+实例+内存机制的方式详细讲解。

一、核心比喻(快速理解)

vector想象成一个装小球的纸箱

  • size:纸箱里实际装的小球数量(能直接数到的小球个数)。
  • capacity:纸箱最大能容纳的小球数量(不换更大的纸箱时,最多能装这么多)。
  • 当小球数量(size)超过纸箱容量(capacity)时,你需要换一个更大的纸箱(扩容),把原来的小球全部搬过去,这个过程会消耗额外的时间和资源。

二、正式定义与特点

1. size(大小)
  • 定义vector实际存储的元素个数
  • 获取方式:调用vector的成员函数size()
  • 合法访问范围:可以通过下标[0, size()-1]访问元素(超出这个范围是未定义行为,除非用at()会抛异常)。
  • 影响size的操作:所有会增加/删除元素的操作都会改变size,比如:
    • 构造函数(vector<int> arr(5)size=5)。
    • push_back()(尾部加元素,size+1)、pop_back()(尾部删元素,size-1)。
    • resize(n)(直接设置sizen)。
    • insert()(插入元素,size增加)、erase()(删除元素,size减少)。
2. capacity(容量)
  • 定义vector当前分配的连续内存空间能容纳的最大元素个数(无需扩容时的上限)。
  • 获取方式:调用vector的成员函数capacity()
  • 核心特点capacity ≥ size(永远成立,因为内存至少要装下当前所有元素)。
  • 影响capacity的操作:只有内存重新分配的操作才会改变capacity,比如:
    • reserve(n)(手动预留容量,若n>原capacity,则capacity变为n;否则无变化)。
    • 扩容(当push_back()/insert()导致size超过capacity时,vector会自动分配更大的内存,capacity随之增大)。
    • shrink_to_fit()(C++11+,尝试将capacity缩小到与size相等,注意:这是请求而非强制,编译器可能忽略)。
    • 注意:pop_back()/erase()只会减少size不会改变capacity(内存不会自动释放,避免频繁的内存分配/释放)。

三、实例演示(直观看到变化)

通过代码一步步看sizecapacity的变化,以GCC编译器(扩容策略为原容量的1.5倍)为例(MSVC是2倍,规律一致)。

#include<vector>#include<iostream>usingnamespacestd;intmain(){// 1. 空vector:size=0,capacity=0(无元素,无内存)vector<int>arr;cout<<"空vector:size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=0,capacity=0// 2. push_back第一个元素:size=1,capacity=1(自动分配内存)arr.push_back(1);cout<<"push_back(1):size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=1,capacity=1// 3. push_back第二个元素:size=2,capacity=2(扩容到2,1*2=2)arr.push_back(2);cout<<"push_back(2):size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=2,capacity=2// 4. push_back第三个元素:size=3,capacity=3(GCC扩容到1.5倍:2*1.5=3)arr.push_back(3);cout<<"push_back(3):size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=3,capacity=3// 5. reserve(10):手动预留容量,size不变,capacity=10arr.reserve(10);cout<<"reserve(10):size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=3,capacity=10// 6. push_back(4):size=4,capacity仍为10(容量足够,无需扩容)arr.push_back(4);cout<<"push_back(4):size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=4,capacity=10// 7. pop_back():size=3,capacity仍为10(只删元素,不释放内存)arr.pop_back();cout<<"pop_back():size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=3,capacity=10// 8. resize(5):size=5(补充2个默认值0),capacity仍为10arr.resize(5);cout<<"resize(5):size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=5,capacity=10// 9. shrink_to_fit():尝试将capacity缩小到size=5arr.shrink_to_fit();cout<<"shrink_to_fit():size="<<arr.size()<<",capacity="<<arr.capacity()<<endl;// size=5,capacity=5return0;}

输出结果(GCC)

空vector:size=0,capacity=0 push_back(1):size=1,capacity=1 push_back(2):size=2,capacity=2 push_back(3):size=3,capacity=3 reserve(10):size=3,capacity=10 push_back(4):size=4,capacity=10 pop_back():size=3,capacity=10 resize(5):size=5,capacity=10 shrink_to_fit():size=5,capacity=5

四、关键机制:vector的扩容原理

vector底层是连续的内存空间(和数组一样),这意味着它的内存地址是连续的,无法在原内存后直接追加空间(可能被其他数据占用)。因此:

  1. size超过capacity时,vector自动扩容
    • 步骤1:分配一块更大的连续内存(扩容策略:GCC是1.5倍,MSVC是2倍,目的是减少扩容次数)。
    • 步骤2:将原内存中的所有元素拷贝/移动到新内存。
    • 步骤3:释放原内存。
  2. 扩容的性能开销:拷贝元素+内存分配/释放,因此如果提前知道元素数量,用reserve(n)预留容量可以避免频繁扩容,提升性能。

五、易混淆的resizereserve(结合size/capacity)

这两个函数是操作sizecapacity的核心,很多人容易搞混,这里总结对比:

函数作用对象size的影响capacity的影响
resize(n)size直接设置sizenn>原capacity,则capacity扩容到≥n;否则不变
reserve(n)capacity无影响(size保持不变)n>原capacity,则capacity变为n;否则不变

举例说明

  • vector<int> arr; arr.resize(5);size=5capacity≥5(可直接下标赋值arr[0]=1)。
  • vector<int> arr; arr.reserve(5);size=0capacity=5不能下标赋值arr[0]=1,因为size=0,元素不存在)。

六、总结关键点

  1. size实际元素个数capacity内存能容纳的最大元素个数,且capacity ≥ size
  2. 改变元素数量的操作(如push_backresize)影响size;只有内存重新分配时(如reserve、扩容)才影响capacity
  3. 扩容会带来性能开销,因此已知元素数量时,优先用reserve(n)预留容量,或直接用构造函数/resize设置size
  4. pop_back/erase不会释放内存(capacity不变),若要释放多余内存,可使用shrink_to_fit()(C++11+)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1143026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

终极《无人深空》存档编辑器使用指南:从新手到专家的完整教程

终极《无人深空》存档编辑器使用指南&#xff1a;从新手到专家的完整教程 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each it…

5步快速上手FastReport开源报表:让.NET数据呈现更简单

5步快速上手FastReport开源报表&#xff1a;让.NET数据呈现更简单 【免费下载链接】FastReport Free Open Source Reporting tool for .NET6/.NET Core/.NET Framework that helps your application generate document-like reports 项目地址: https://gitcode.com/gh_mirror…

rs485通讯协议代码详解:简单项目中的应用入门

RS485通信实战全解析&#xff1a;从硬件到代码&#xff0c;手把手教你构建稳定可靠的工业总线系统你有没有遇到过这样的场景&#xff1f;在工厂车间里&#xff0c;几个温湿度传感器离主控柜几十米远&#xff0c;用普通串口通信总是丢数据&#xff1b;或者多个设备同时联网时&am…

从零到一:uni-app电商项目实战拆解指南

从零到一&#xff1a;uni-app电商项目实战拆解指南 【免费下载链接】uniapp-shop-vue3-ts uni-app 开发的微信小程序-小兔鲜儿电商项目 项目地址: https://gitcode.com/gh_mirrors/un/uniapp-shop-vue3-ts 想象一下&#xff0c;你刚接手一个电商项目&#xff0c;老板要求…

Cursor Pro功能免费使用完整指南:告别试用限制的终极方案

Cursor Pro功能免费使用完整指南&#xff1a;告别试用限制的终极方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your …

Multisim访问用户数据库:实验数据管理核心要点

Multisim连接数据库实战&#xff1a;打造可追溯的电子实验数据流你有没有遇到过这样的场景&#xff1f;一个学生做完“共射放大器频率响应”实验&#xff0c;交上来一份手写记录表&#xff0c;写着&#xff1a;“当负载电容为10nF时&#xff0c;截止频率约25kHz”。而另一个学生…

Realtek RTL8152系列USB网卡驱动深度解析与实战部署

Realtek RTL8152系列USB网卡驱动深度解析与实战部署 【免费下载链接】r8152 Synology DSM driver for Realtek RTL8152/RTL8153/RTL8156 based adapters 项目地址: https://gitcode.com/gh_mirrors/r8/r8152 在当今高速网络时代&#xff0c;USB以太网适配器已成为提升设…

Vue 3企业级后台系统快速上手:Element Plus Admin完整实践指南

Vue 3企业级后台系统快速上手&#xff1a;Element Plus Admin完整实践指南 【免费下载链接】element-plus-admin 基于vitetselementPlus 项目地址: https://gitcode.com/gh_mirrors/el/element-plus-admin Element Plus Admin是基于现代Vue.js 3技术栈构建的企业级后台管…

青龙面板自动化脚本终极配置指南:快速上手滑稽脚本库

青龙面板自动化脚本终极配置指南&#xff1a;快速上手滑稽脚本库 【免费下载链接】huajiScript 滑稽の青龙脚本库 项目地址: https://gitcode.com/gh_mirrors/hu/huajiScript 想要告别重复的手动操作&#xff0c;体验自动化带来的便利&#xff1f;青龙面板结合滑稽脚本库…

【std::vector】vector<T*>与vector<T>*

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、先回答第一个问题&#xff1a;vector<int*> 类型拷贝前&#xff0c;是否需要遍历一遍元素 delete&#xff1f;1. 核心前提&#xff1a;vector<int*>…

PDF-Extract-Kit前端定制:WebUI界面修改教程

PDF-Extract-Kit前端定制&#xff1a;WebUI界面修改教程 1. 引言 1.1 工具背景与开发初衷 PDF-Extract-Kit 是一款由开发者“科哥”主导构建的开源 PDF 智能提取工具箱&#xff0c;旨在为科研人员、教育工作者和文档处理从业者提供一套完整的自动化文档解析解决方案。该工具…

终极指南:3招彻底解决百度网盘下载龟速问题

终极指南&#xff1a;3招彻底解决百度网盘下载龟速问题 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘下载速度慢如蜗牛而苦恼吗&#…

Multisim下载前必读:版本选择与系统要求全面讲解

Multisim下载前必读&#xff1a;如何选对版本、配好电脑&#xff0c;一次安装成功&#xff1f; 你是不是也经历过这样的场景&#xff1f; 兴冲冲地打开浏览器搜索“Multisim下载”&#xff0c;点进官网准备安装&#xff0c;结果发现&#xff1a; 下下来的版本打不开、装到一半…

STM32CubeMX打不开:权限配置错误的核心要点

STM32CubeMX打不开&#xff1f;别急着重装&#xff0c;先看看权限这道坎 你有没有遇到过这样的情况&#xff1a;刚配好开发环境&#xff0c;兴冲冲双击桌面的 STM32CubeMX 图标&#xff0c;结果——什么都没发生&#xff1f; 任务管理器里 javaw.exe 闪了一下就消失&…

LeRobot SO-101协作机械臂:从零开始的完整搭建指南

LeRobot SO-101协作机械臂&#xff1a;从零开始的完整搭建指南 【免费下载链接】lerobot &#x1f917; LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 还在为复杂的机器人…

Winlator模拟器性能优化:60帧畅玩《GTA V》终极解决方案

Winlator模拟器性能优化&#xff1a;60帧畅玩《GTA V》终极解决方案 【免费下载链接】winlator Android application for running Windows applications with Wine and Box86/Box64 项目地址: https://gitcode.com/GitHub_Trending/wi/winlator 你是否曾在Android设备上…

PKHeX自动合法性插件终极指南:从入门到精通全解析

PKHeX自动合法性插件终极指南&#xff1a;从入门到精通全解析 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 还在为宝可梦数据合法性验证而头疼吗&#xff1f;PKHeX自动合法性插件正是解决这一问题的利…

TouchGal:Galgame爱好者的终极社区体验完整指南

TouchGal&#xff1a;Galgame爱好者的终极社区体验完整指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 在当前数字时代&#xff…

Waydroid架构解析:基于Linux容器的Android系统实现原理

Waydroid架构解析&#xff1a;基于Linux容器的Android系统实现原理 【免费下载链接】waydroid Waydroid uses a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/wa/waydroid…

Waydroid容器化Android系统在Linux环境中的深度部署指南

Waydroid容器化Android系统在Linux环境中的深度部署指南 【免费下载链接】waydroid Waydroid uses a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/wa/waydroid 技术…