vector容器-预留空间讲解

简介: vector容器-预留空间讲解

std::vector 是 C++ 标准库中的一个动态数组容器,它允许我们在运行时动态地增加或减少元素。然而,由于 vector 在添加元素时可能需要重新分配内存并移动现有元素,这可能会导致性能问题。为了避免不必要的内存分配和元素移动,vector 提供了一个预留空间的功能,即 reserve 成员函数。通过预先分配足够的内存空间,我们可以减少因内存分配和元素移动带来的开销,提高程序的性能。

 

reserve 函数的作用

reserve 函数的作用是改变 vector 的容量(capacity),即预先分配一定大小的内存空间,但不改变其大小(size)。这样做的好处是,在后续添加元素时,只要不超过预留的容量,vector 就不会再进行内存分配和元素移动,从而提高了性能。

 

使用 reserve 的场景

通常,在知道将要向 vector 中添加大量元素时,或者在循环中反复添加元素时,使用 reserve 是很有用的。通过预先分配足够的内存空间,可以避免多次小规模的内存分配和元素移动,从而优化性能。

 

代码示例与讲解

下面是一个使用 reserve 的示例代码: #include <iostream>  

#include <vector>  
#include <chrono> // 用于计时  
  
int main() {  
    // 不使用 reserve 的情况  
    {  
        std::vector<int> vecWithoutReserve;  
        auto start = std::chrono::high_resolution_clock::now();  
        for (int i = 0; i < 1000000; ++i) {  
            vecWithoutReserve.push_back(i);  
        }  
        auto end = std::chrono::high_resolution_clock::now();  
        std::chrono::duration<double> diff = end - start;  
        std::cout << "不使用 reserve 添加 1000000 个元素的时间: " << diff.count() << " 秒" << std::endl;  
    }  
  
    // 使用 reserve 的情况  
    {  
        std::vector<int> vecWithReserve;  
        vecWithReserve.reserve(1000000); // 预留足够空间  
        auto start = std::chrono::high_resolution_clock::now();  
        for (int i = 0; i < 1000000; ++i) {  
            vecWithReserve.push_back(i);  
        }  
        auto end = std::chrono::high_resolution_clock::now();  
        std::chrono::duration<double> diff = end - start;  
        std::cout << "使用 reserve 添加 1000000 个元素的时间: " << diff.count() << " 秒" << std::endl;  
    }  
  
    return 0;  
}

 

在这个示例中,我们创建了两个 vector 对象,一个不使用 reserve,另一个使用 reserve 预留了足够的空间。

目录
相关文章
|
6月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
58 0
|
8月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
|
7月前
|
存储 安全 C++
|
7月前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
8月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
395 0
|
8月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
76 0
|
14天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
221 15
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
317 78
|
1月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
177 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
2月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序