news 2026/2/10 2:50:41

【std::vector】避免频繁扩容方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【std::vector】避免频繁扩容方法

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

文章目录

      • 一、核心场景:已知大小,需手动填充不同数据
        • 方法1:创建时直接用构造函数指定大小
        • 方法2:先声明,再用`resize()`设置大小
      • 二、进阶场景:已知大小且元素有统一初始值
      • 三、特殊场景:已知大小,且知道具体元素列表(C++11+)
      • 四、补充:若非要用`push_back`(但不想扩容)
      • 关键注意事项(避坑点)

当你已知动态数组(vector)的大小,想要直接创建对应大小的空间并直接赋值(避免push_back带来的扩容或频繁追加操作),核心思路是先确定vectorsize(元素个数)或提前预留足够的capacity(容量),再通过下标/迭代器直接赋值。以下是几种最常用的方法,按场景分类说明:

一、核心场景:已知大小,需手动填充不同数据

这种场景是最常见的(比如已知数组大小为n,后续要通过循环赋值1、2、3…n),推荐两种方式:

方法1:创建时直接用构造函数指定大小

利用vector的构造函数vector<T>(n)直接创建包含n个默认初始化元素的vector,此时size = ncapacity ≥ n,可以直接通过**下标[]at()**赋值(无需push_back)。

#include<vector>#include<iostream>usingnamespacestd;intmain(){// 已知数组大小为5,直接创建包含5个默认初始化元素(int为0)的vectorintn=5;vector<int>arr(n);// 此时arr: [0, 0, 0, 0, 0],size=5,capacity≥5// 直接通过下标赋值,不会触发任何内存扩容for(inti=0;i<n;i++){arr[i]=i+1;// 赋值为1,2,3,4,5// 或用arr.at(i) = i + 1; // at()有越界检查,更安全(越界会抛异常),[]无检查(越界是未定义行为)}// 输出:1 2 3 4 5for(intnum:arr){cout<<num<<" ";}return0;}
方法2:先声明,再用resize()设置大小

如果需要先声明vector,再后续确定大小(比如大小由变量计算得到),可以用resize(n)vectorsize设置为n,效果和构造函数一致。

#include<vector>#include<iostream>usingnamespacestd;intmain(){vector<int>arr;// 初始为空,size=0,capacity=0intn=5;arr.resize(n);// 调整size为5,元素默认初始化(int为0),capacity≥5// 直接赋值for(inti=0;i<n;i++){arr[i]=i*2;// 赋值为0,2,4,6,8}// 输出:0 2 4 6 8for(intnum:arr){cout<<num<<" ";}return0;}

二、进阶场景:已知大小且元素有统一初始值

如果不仅知道大小,还知道所有元素的初始值(比如大小为5,所有元素初始值为10),可以直接用带初始值的构造函数,一步完成大小和值的初始化,无需后续赋值。

#include<vector>#include<iostream>usingnamespacestd;intmain(){intn=5;intinit_val=10;// 创建包含5个元素的vector,每个元素都是10vector<int>arr(n,init_val);// 此时arr: [10, 10, 10, 10, 10]// 若需要修改部分元素,仍可直接下标赋值arr[2]=99;// arr变为:[10,10,99,10,10]// 输出:10 10 99 10 10for(intnum:arr){cout<<num<<" ";}return0;}

三、特殊场景:已知大小,且知道具体元素列表(C++11+)

如果不仅知道大小,还知道每个元素的具体值,可以用初始化列表直接创建,此时vector的大小就是元素列表的长度,无需额外设置。

#include<vector>#include<iostream>usingnamespacestd;intmain(){// 已知元素为1,3,5,7,9(大小为5),直接用初始化列表创建vector<int>arr{1,3,5,7,9};// 也可修改元素arr[1]=4;// arr变为:[1,4,5,7,9]// 输出:1 4 5 7 9for(intnum:arr){cout<<num<<" ";}return0;}

四、补充:若非要用push_back(但不想扩容)

如果你偶尔还是需要用push_back,但想避免扩容(因为扩容会涉及内存重新分配和元素拷贝),可以用**reserve(n)预留容量**(注意:reserve只改变capacity,不改变size,所以不能直接下标赋值)。

#include<vector>#include<iostream>usingnamespacestd;intmain(){intn=5;vector<int>arr;arr.reserve(n);// 预留5个元素的容量,size仍为0,不会触发扩容// 用push_back添加元素,此时不会扩容(因为容量足够)for(inti=0;i<n;i++){arr.push_back(i+1);}// 输出:1 2 3 4 5for(intnum:arr){cout<<num<<" ";}return0;}

关键注意事项(避坑点)

  1. 区分resizereserve
    • resize(n):修改vector的**size**(元素个数),会创建/删除元素,因此可以直接下标赋值。
    • reserve(n):仅预留**capacity**(内存容量),不改变size,因此不能直接下标赋值(此时size=0,下标访问会越界)。
  2. 下标[]at()的区别
    • arr[i]:无越界检查,效率高,但越界时会导致未定义行为(程序崩溃)。
    • arr.at(i):有越界检查,越界时会抛出out_of_range异常,更安全,适合调试。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/2 16:34:50

【std::vector】size、capacity小结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、核心比喻&#xff08;快速理解&#xff09;二、正式定义与特点1. size&#xff08;大小&#xff09;2. capacity&#xff08;容量&#xff09;三、实例演示&…

作者头像 李华
网站建设 2026/2/6 18:11:23

Vue 3后台管理系统实战宝典:Element Plus Admin高效开发全攻略

Vue 3后台管理系统实战宝典&#xff1a;Element Plus Admin高效开发全攻略 【免费下载链接】element-plus-admin 基于vitetselementPlus 项目地址: https://gitcode.com/gh_mirrors/el/element-plus-admin 想要快速搭建一个专业的企业级后台管理系统吗&#xff1f;基于V…

作者头像 李华
网站建设 2026/2/7 21:31:10

NomNom:No Man‘s Sky存档编辑器的技术实现与应用指南

NomNom&#xff1a;No Mans Sky存档编辑器的技术实现与应用指南 【免费下载链接】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 item indivi…

作者头像 李华
网站建设 2026/2/5 21:05:15

Harepacker复活版:MapleStory游戏资源的终极编辑神器

Harepacker复活版&#xff1a;MapleStory游戏资源的终极编辑神器 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 在游戏开发与修改的世界里&…

作者头像 李华
网站建设 2026/2/5 17:57:17

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

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

作者头像 李华
网站建设 2026/2/7 0:49:58

PDF-Extract-Kit技巧:提高表格结构识别准确率

PDF-Extract-Kit技巧&#xff1a;提高表格结构识别准确率 1. 背景与挑战&#xff1a;PDF表格提取的痛点 在科研、金融、法律等领域的文档处理中&#xff0c;PDF格式因其版式固定、跨平台兼容性强而被广泛使用。然而&#xff0c;当需要将PDF中的信息数字化时&#xff0c;尤其是…

作者头像 李华