首页 > 其他分享 >std::vector::reserve

std::vector::reserve

时间:2024-09-25 20:33:54浏览次数:8  
标签:std 元素 vector vec 分配 reserve

std::vector::reserve 函数在 C++ 中用于预分配内存,避免在元素增加时多次重新分配内存,从而提高性能。

它最常用于需要频繁向 vector 中添加元素,并且可以预估容器的最终大小的场景。

作用

reserve 函数的主要作用是:

  1. 预分配容量:它提前为 vector 分配一定数量的内存(但不会改变当前 vector 的元素数量 size)。也就是说,它只是增加 vector 的容量 capacity,使其能够容纳更多元素,而不需要反复分配和释放内存。

  2. 避免多次内存分配和拷贝:在 vector 中,如果你频繁调用 push_back 向容器添加新元素,而没有事先为 vector 分配足够的容量,容器在容量不足时会自动扩容。这会导致每次扩容时进行内存分配,并将现有元素拷贝到新的内存地址。reserve 通过提前分配足够的空间,减少或避免了这些昂贵的操作。

场景

reserve 通常用于以下场景:

  1. 已知或可以预估元素的数量:如果你知道或者可以大致估计 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 添加元素时,不会频繁地重新分配内存,提升了性能。

  2. 性能优化在高性能的应用中,特别是需要处理大量数据时,如果向 vector 中添加元素的操作非常频繁且每次添加元素都会导致 vector 扩容,会严重影响性能。reserve 可以通过减少内存分配和拷贝操作来提升性能。

  3. 避免扩容导致的迭代器失效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;
    }
    

reserveresize 的区别

  • 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,vec,分配,reserve
From: https://www.cnblogs.com/niumachen/p/18432144

相关文章

  • 【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
    文章目录C++`vector`容器详解:从入门到精通前言第一章:C++`vector`容器简介1.1C++STL容器概述1.2为什么使用`vector`1.3`vector`的优缺点第二章:`vector`的构造方法2.1常见构造函数2.1.1示例:不同构造方法2.1.2相关文档第三章:`vector`容量与大小操作3.1......
  • STL之手撕vector
    前言面试的时候遇到了,是从来没想过会出问题的手撕。竟然在面试环节下出了不少纰漏。要点构造函数:默认构造、拷贝构造、赋值运算符重载、移动构造函数、析构函数push_back/pop_back代码#include<iostream>usingnamespacestd;#defineDEFAULT_CAP(200)class......
  • 【C++】vector-1
    文章目录1.vector的介绍及使用1.1vector的介绍1.2vector的使用1.2.1vector的定义1.2.2vectoriterator的使用1.2.3vector空间增长问题1.2.4vector增删查改1.vector的介绍及使用1.1vector的介绍1.vector是表示可变大小数组的序列容器。2.就像数组一样,vec......
  • string和oj题以及vector的接口介绍
    前言上篇博客学习了一些string类的模拟实现erase、find、substr、比较大小、流输入、流输出,这篇博客将介绍剩下的一些string的知识以及vector的一些使用方式。string传统深拷贝的写法//拷贝构造string(conststring&s){ _str=newchar[s._capacity+1]; strcpy(......
  • 华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
    ......
  • `std::optional` 函数返回值
    std::optional是C++17中引入的一个模板类,用于表示一个值可能存在也可能不存在的情况。它可以存储一个值,或者表示没有值的状态,类似于其他编程语言中的“可选”类型。std::optional主要特性:值的存在性:可以使用has_value()方法检查std::optional是否包含一个有效的值。访......
  • `std::string_view`(c++17) 和 `std::stringstream` 使用区别·
    std::string_view和std::stringstream都是C++中处理字符串的工具,但它们的设计目标和使用场景非常不同。我们可以通过几方面进行对比。1.设计目的和核心功能std::string_view:设计用于只读访问字符串或字符序列。是一个轻量级的字符串视图,不会持有字符串的数据,仅仅是对......
  • [VLDBJ24] Survey of vector database management systems
    https://blog.csdn.net/Datawhale/article/details/1344535331.Intro非结构化数据压成\(D\)维向量五个问题:模糊搜索标准:向量不太适应模糊语义查询更多代价:\(O(D)\)内存消耗大:全要访问缺乏结构:(有结构的可以排序啥的index她不行)和属性不兼容(不太明白,可能是别的可以......
  • MIL-STD-1553B 在现代航空航天与军事领域的应用案例
    MIL-STD-1553B作为一种成熟且可靠的航空电子数据总线标准,在航空航天、军事等领域发挥着至关重要的作用。以下将通过几个具体的案例来展示其广泛的应用和卓越的性能。一、军用飞机航空电子系统 在先进的军用战斗机中,MIL-STD-1553B总线被广泛用于整合和管理各种航空电子设备,如飞......
  • std::vector 和 std::map 都支持以下比较运算符
    在C++标准库中,std::vector和std::map都支持以下比较运算符:==(相等运算符)!=(不等运算符)<(小于运算符)<=(小于等于运算符)>(大于运算符)>=(大于等于运算符)1.std::vector的比较对于std::vector,这些运算符通过词典序比较(lexicographicalcomparison)进行。词典序比较类似于字......