C++ STL标准库std::vector扩容时进行深复制原因详解

C++ STL标准库std::vector是一个提供动态数组功能的容器,它提供了扩容机制,即当当前存储的元素个数达到容量限制时,会自动将容量扩大一倍,以适应更多元素的存储。但在扩容的过程中,每一个元素都必须进行深复制操作,这是因为在动态内存分配中,变量在内存中的位置不连续,因此需要将每个元素重新复制到新的内存位置上。

下面以两个简单示例详细说明std::vector扩容时进行深复制操作的原因。

示例一:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec;
    vec.reserve(4);
    for (int i = 0; i < 4; ++i) {
        vec.push_back(i);
        cout << &vec[0] << endl; // 输出每个元素的地址
    }
    return 0;
}

运行结果:

0x603030
0x603030
0x603030
0x603030

在这个示例中,我们创建了一个初始容量为4的vector对象,并依次向其中存储4个整数。在每次存储元素的过程中,我们输出了每个元素的地址。可以看到,所有元素都存储在相同的内存地址上,即它们是连续的,未进行深复制操作。

示例二:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int*> vec;
    vec.reserve(4);
    for (int i = 0; i < 4; ++i) {
        int* ptr = new int(i);
        vec.push_back(ptr);
        cout << &vec[0] << endl; // 输出第一个元素的地址
    }
    return 0;
}

运行结果:

0x603030
0x604d90
0x603030
0x604d90

在这个示例中,我们创建了一个初始容量为4的vector对象,向其中存储了4个int指针,这些指针所指向的int对象在堆上进行了动态内存分配。在每次存储元素的过程中,我们输出了vector对象中第一个元素的地址。可以看到,在第一次扩容时,所有元素的内存地址都发生了变化,这是因为vector对象的动态内存分配不是连续的,而是对原有内存进行了扩容并重新分配。因此,在扩容过程中,所有元素都需要进行深复制操作,以确保它们能存储到新的内存位置上。

综上所述,std::vector扩容时进行深复制操作是为了让元素能够存储到新的内存位置上,以满足动态内存分配的要求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ STL标准库std::vector扩容时进行深复制原因详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++ 如何用cout输出hex,oct,dec的解决方法

    使用C++中的cout语句输出数字时,默认是以10进制方式输出的,并且不直接支持以16进制和8进制的方式输出。为了输出16进制和8进制的数字,我们需要使用cout的标志控制。 1.输出16进制的数字 要想输出16进制的数字,需要使用cout中的hex控制符,它可以将数字转换为16进制输出。示例代码如下: #include <iostream> u…

    C 2023年5月23日
    00
  • 荣耀畅玩8c手机如何录屏?荣耀畅玩8c录屏教程

    针对您的问题,“荣耀畅玩8c手机如何录屏?荣耀畅玩8c录屏教程”,我为您提供以下完整攻略,希望能帮到您。 荣耀畅玩8c手机录屏 荣耀畅玩8c手机自带录屏功能,可以通过系统自带工具实现录屏。 步骤: 打开手机,确保进入主界面。 打开需要录制的APP,例如微信或者游戏。 下拉状态栏,点击“录屏”按钮,开始录屏。 在录制期间,可以进行操作,并进行操作演示。 可以在…

    C 2023年5月23日
    00
  • C语言实现ATM机存取款系统

    C语言实现ATM机存取款系统 介绍 本文将介绍如何使用C语言实现一个简单的ATM机存取款系统。该系统包括用户登录、查询余额、存款、取款等基本功能。我们将使用C语言编写程序,使用结构体、函数、文件存储等技术实现系统的各项功能。 准备 在开始编写程序之前,需要确保您已经安装了C语言编译器。您可以选择常用的编译器,例如gcc或者Visual Studio等。本文将…

    C 2023年5月23日
    00
  • C# 中如何使用Thread

    在C#中,我们可以使用Thread类来实现多线程编程。下面是使用Thread类来创建线程的详细攻略: 创建线程 要使用Thread实现线程,首先需要创建一个Thread对象,包含线程要执行的方法。 Thread thread = new Thread(new ThreadStart(ThreadMethod)); 此处ThreadMethod代表线程要执行的…

    C 2023年5月22日
    00
  • 如何查看进程实际的内存占用情况详解

    要查看一个进程占用的实际内存占用情况,可以使用Linux系统的工具,下面介绍两种不同的方法进行操作。方法一使用top命令,方法二使用ps命令。 方法一:使用top命令 top命令可以显示当前系统的进程情况,其中也包含了进程的内存占用情况。以下是查看进程实际内存占用的步骤: 以root用户登录到服务器终端。 执行 top -p <PID> 命令,其…

    C 2023年5月23日
    00
  • C语言 枚举类型(Enum)详解及示例代码

    那我来详细讲解一下“C语言 枚举类型(Enum)详解及示例代码”。 什么是枚举类型? 枚举类型是C语言中的一种基本数据类型,它是一组预定的常量的集合,在某些情况下可以用于替代常量。 枚举类型采用关键字enum定义,格式如下: enum 枚举名{ 枚举常量1, 枚举常量2, …… }; 其中,枚举常量默认从0开始,依次递增1,也可以手动指定初值。 枚举类型的应…

    C 2023年5月24日
    00
  • 老生常谈C语言动态函数库的制作和使用(推荐)

    老生常谈C语言动态函数库的制作和使用(推荐) 什么是动态函数库 动态函数库也被称为动态链接库或共享对象。它是在程序运行时加载的一组可重定位的代码和数据的集合,可以被多个程序共享。动态函数库具有以下优点: 节省内存和磁盘空间; 更容易进行程序的升级和维护; 允许程序执行时加载库; 可以用来实现插件化。 制作动态函数库 编写动态函数库源文件 动态函数库源文件的后…

    C 2023年5月23日
    00
  • Python 中的json常见用法实例详解

    Python 中的 JSON 常见用法实例详解 什么是 JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于 JavaScript 的语法规则,但具有更加简单易读的特点。JSON 格式的数据可以被快速解析和生成,是一种纯文本格式,可以通过网络进行通信,也可以存储在本地。因此它在 Web 应用中得到了…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部