std::vector::reserve
std::vector::reserve 函数在 C++ 中用于预分配内存,避免在元素增加时多次重新分配内存,从而提高性能。
它最常用于需要频繁向 vector 中添加元素,并且可以预估容器的最终大小的场景。
作用
reserve 函数的主要作用是:
预分配容量:它提前为
vector分配一定数量的内存(但不会改变当前vector的元素数量size)。也就是说,它只是增加vector的容量capacity,使其能够容纳更多元素,而不需要反复分配和释放内存。避免多次内存分配和拷贝:在
vector中,如果你频繁调用push_back向容器添加新元素,而没有事先为vector分配足够的容量,容器在容量不足时会自动扩容。这会导致每次扩容时进行内存分配,并将现有元素拷贝到新的内存地址。reserve通过提前分配足够的空间,减少或避免了这些昂贵的操作。
场景
reserve 通常用于以下场景:
已知或可以预估元素的数量:如果你知道或者可以大致估计
vector最终会存储多少个元素,可以使用reserve来一次性分配足够的内存空间,避免扩容时频繁的内存分配与拷贝。示例:
#include <iostream>
#include <vector> int main() {
std::vector<int> vec;
vec.reserve(100); // 预先分配100个元素的空间 for (int i = 0; i < 100; ++i) {
vec.push_back(i); // 不会触发多次扩容
} std::cout << "Vector size: " << vec.size() << std::endl;
std::cout << "Vector capacity: " << vec.capacity() << std::endl; return 0;
}
在这个例子中,调用
reserve(100)会一次性分配能够容纳 100 个元素的内存空间。因此,在push_back添加元素时,不会频繁地重新分配内存,提升了性能。性能优化:在高性能的应用中,特别是需要处理大量数据时,如果向
vector中添加元素的操作非常频繁且每次添加元素都会导致vector扩容,会严重影响性能。reserve可以通过减少内存分配和拷贝操作来提升性能。避免扩容导致的迭代器失效:当
vector扩容时,之前的元素会被拷贝到新的内存地址,导致之前的迭代器失效。如果提前使用reserve分配好足够的空间,可以避免这种问题,特别是在对迭代器的连续访问中。迭代器失效示例:
#include <iostream>
#include <vector> int main() {
std::vector<int> vec;
vec.reserve(10); // 预留空间避免迭代器失效 vec.push_back(1);
vec.push_back(2);
vec.push_back(3); // 获取迭代器
auto it = vec.begin(); // 继续向vector添加元素
vec.push_back(4); // 不会导致迭代器失效 std::cout << "First element: " << *it << std::endl; // 输出正确结果 return 0;
}
reserve 与 resize 的区别
reserve:只改变vector的容量,但不改变其大小。也就是说,它只预分配内存,但并不实际增加或减少vector中的元素。resize:不仅改变vector的大小,还会相应地创建或销毁元素。它会让vector的大小变为指定的大小,添加默认构造的元素(如果扩大),或删除多余的元素(如果缩小)。
示例:
std::vector<int> vec;
vec.reserve(10); // 仅分配内存,但不添加元素,vec.size() 仍为 0
vec.resize(10); // 改变size,vec.size() 为 10,默认值填充
总结
std::vector::reserve 在以下场景非常有用:
- 需要大量动态添加元素时。
- 知道或能够预估元素的数量时。
- 想要避免不必要的内存分配、拷贝和迭代器失效时。
通过合理使用 reserve,可以有效地优化程序的性能,减少 vector 的内存管理开销。
std::vector::reserve的更多相关文章
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- C++ 中的std::vector介绍(转)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- std::vector介绍
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- 使用std::vector优化点云动画显示一例
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移 ...
- std::vector利用swap()函数进行内存的释放【转】
首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...
- C++ std::vector
std::vector template < class T, class Alloc = allocator<T> > class vector; // generic te ...
- 编程杂谈——std::vector与List<T>的性能比较
昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...
- C++ std::vector 基本用法2
#include <iostream> #include <vector> using namespace std; int main() { int ar[10] = { 1 ...
- C++ std::vector指定位置插入
使用vector,必须加上:#include <vector> 1.初始化vector,一般有这几种方式: std::vector<std::wstring> v1; //创建 ...
- C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案
介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...
随机推荐
- 对比python学julia(第四章:人工智能)--(第三节)目标检测
1.1. 项目简介 目标检测(Object Detection)的任务是在图像中找出检测对象的位置和犬小,是计算机视觉领域的核心问题之一,在自动驾驶.机器人和无人机等许多领域极具研究价值. 随着深度 ...
- 华为最高学术成果发表 —— 《Nature》正刊发表论文《Accurate medium-range global weather forecasting with 3D neural networks》
论文<Accurate medium-range global weather forecasting with 3D neural networks>的<Nature>地址: ...
- DolphinScheduler 3.3.0版本更新一览
Apache DolphinScheduler即将迎来3.3.0版本的发布,届时将有一系列重要的更新和改进.在近期的社区5月份用户线上分享会上,项目PMC 阮文俊为大家介绍了3.3.0版本将带来的主要 ...
- 关于mysql配置文件中jdbc url 的记录
版本不同 url不同 大同小异 基本就是不同参数配置的区别 maven 仓库地址 https://mvnrepository.com/artifact/mysql/mysql-connector-ja ...
- 位移运算符 1<<4
转载自 https://www.cnblogs.com/ljangle/p/13036992.html 位运算 1 << 4 static final int DEFAULT_INIT ...
- 使用BizyAir,没有显卡,也能玩AI绘图
或许很多人跟我一样,没有显卡,但又很想玩AI绘图,但本地绘图怕是无缘了,只能借助云GPU的方式了. 今天跟大家分享一下一个简单目前可白嫖无门槛的方法实现无显卡也能玩AI绘图. 方案就是ComfyUI+ ...
- TwinCAT3 - 实现自己的Tc2_SerialCom
目录 1,前言 2,原生Tc2_SerialCom简单使用 3,实现自己的Tc2_SerialCom 3.1,EL6inData22B,EL6outData22B 3.2,ComBuffer 3.3, ...
- 什么是淘宝API?
淘宝API是淘宝开放平台提供给开发者的一系列应用程序编程接口,它们允许开发者访问和使用淘宝的数据和服务.通过这些API,开发者可以构建应用程序,实现商品信息检索.订单管理.用户行为分析.物流跟踪等 ...
- [深度学习] 时间序列分析工具TSLiB库使用指北
TSLiB是一个为深度学习时间序列分析量身打造的开源仓库.它提供了多种深度时间序列模型的统一实现,方便研究人员评估现有模型或开发定制模型.TSLiB涵盖了长时预测(Long-term forecast ...
- 开源项目管理工具 Plane 安装和使用教程
说到项目管理工具,很多人脑海中第一个蹦出来的可能就是 Jira 了.没错,Jira 确实很强大,但是...它也有点太强大了,既复杂又昂贵,而且目前也不再提供私有化部署版本了. 再说说飞书,作为国产之光 ...