news 2026/4/18 7:54:17

【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/4/18 7:26:33

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

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

作者头像 李华
网站建设 2026/4/17 16:07:27

解放动画生产力!Blender骨骼重定向插件深度解析 [特殊字符]

解放动画生产力&#xff01;Blender骨骼重定向插件深度解析 &#x1f3af; 【免费下载链接】blender_BoneAnimCopy 用于在blender中桥接骨骼动画的插件 项目地址: https://gitcode.com/gh_mirrors/bl/blender_BoneAnimCopy 还在为不同角色间的动画兼容问题头疼吗&#x…

作者头像 李华
网站建设 2026/4/18 7:53:28

【std::vector】clear介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录std::vector::clear() 详细说明1. 核心功能2. 对 size 和 capacity 的具体影响3. 代码示例4. 补充说明总结你想了解C标准库中std::vector的clear()成员函数的功能&am…

作者头像 李华
网站建设 2026/3/10 17:35:05

TouchGAL:如何为视觉小说爱好者打造纯净交流空间?

TouchGAL&#xff1a;如何为视觉小说爱好者打造纯净交流空间&#xff1f; 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 还在为寻找…

作者头像 李华
网站建设 2026/3/21 2:38:58

FontForge免费字体设计工具完整指南:从零开始打造专业字体

FontForge免费字体设计工具完整指南&#xff1a;从零开始打造专业字体 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 还在为找不到合适的字体而烦恼吗&#xff1f;想…

作者头像 李华