C语言数据结构之vector底层实现机制解析

C语言数据结构之vector底层实现机制解析

什么是vector?

vector是C++标准库中的一种容器,可以动态调整大小,用于存储数据。

vector的底层实现机制

vector实际上是通过数组实现的,当需要添加元素时,如果当前数组已满,就会重新创建一个更大的数组,并将原数组中的元素复制到新数组中。这样,内存空间得到了增加,同时操作后的元素仍然是顺序存储, 存取元素的时间复杂度仍为O(1)。

vector的成员变量

vector的成员变量包括三个关键变量:

  • start_:指向vector的第一个元素的指针。
  • finish_:指向当前vector中最后一个元素的后一个位置。
  • end_of_storage_:指向vector的一个可用空间(不属于vector中的元素),当添加元素时,如果vector的容量已满,就需要扩容。

vector的操作

vector提供了以下常用的方法:

  • push_back(const T& x):将元素x添加到向量的末尾
  • pop_back():从向量的末尾移除一个元素
  • size():返回向量中元素的个数
  • capacity():返回向量中第一个元素指针到reserve空间末尾的距离
  • resize(size_t n, T x):改变容器的大小为n,如果改变后的大小小于原来的大小,会删除多余的元素,如果改变后的大小大于原来的大小,则会使用元素的默认构造函数添加元素。
  • reserve(size_t n):改变容器中可存储元素的空间大小为n,不会改变向量中的元素数量,如果n小于向量当前的容量,则不会改变向量的容量。如果n大于向量当前的容量,则会改变向量的容量,并保证扩容后仍然是顺序存储。

vector的时间复杂度

在大多数情况下,vector的时间复杂度如下:

  • 访问元素:O(1)
  • 添加元素:O(1)或O(n)(取决于是否需要扩容)
  • 删除元素:O(n)

vector的示例说明

示例一:添加元素

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec;
    for (int i = 0; i < 10; ++i)
    {
        vec.push_back(i);
    }
    for (int i = 0; i < vec.size(); ++i)
    {
        cout << vec[i] << endl;
    }
}

在这个示例中,我们创建一个vector<int>类型的对象,然后将0到9的整数添加到这个对象中。使用push_back()方法将元素添加到vector末尾。添加元素的时间复杂度是O(1)。最后,我们遍历向量并打印所有元素。

示例二:扩容

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec;
    cout << "当前vector的容量为:" << vec.capacity() << endl;
    for (int i = 0; i < 10; ++i)
    {
        vec.push_back(i);
    }
    cout << "当前vector的容量为:" << vec.capacity() << endl;
    vec.reserve(20);
    cout << "reserve(20)后当前vector的容量为:" << vec.capacity() << endl;
}

在这个示例中,我们创建一个vector<int>类型的对象,并使用capacity()方法打印它的初始容量。然后,我们向vector中添加10个整数,每次添加一个整数时,vector都会检查是否需要扩容。最后,我们使用reserve()方法扩展向量的容量,并再次使用capacity()方法打印容量。

输出结果如下:

当前vector的容量为:0
当前vector的容量为:16
reserve(20)后当前vector的容量为:20

在这个示例中,我们观察到在添加元素时vector会自动扩容并保证元素的顺序存储,同时我们也观察到reserve()方法可以手动扩展向量的容量。

总结

成功地理解vector的底层实现机制是学习数据结构的重要一步。vector的时间复杂度通常是常数时间,可以在大多数情况下保证高效和可靠。当操作需求增加,遇到瓶颈时,我们可以手动通过reserve()方法扩容,这可以有效减少不必要的重复分配内存操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之vector底层实现机制解析 - Python技术站

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

相关文章

  • Java数据结构之简单链表的定义与实现方法示例

    Java数据结构之简单链表的定义与实现方法示例 什么是链表 链表是线性数据结构的一种,它是由一个个节点构成的,每个节点包含两个部分,一个是数据,另一个是指向下一个节点的引用,通俗的说,就像火车一样,每节火车都是一个节点,而每车头都指向下一节车厢。 链表的定义 Java中常用链表有单向链表和双向链表,单向链表每个节点只有一个指向下一个节点的引用,而双向链表每个…

    数据结构 2023年5月17日
    00
  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月25日
    00
  • 图计算引擎分析–GridGraph

    作者:京东科技 李永萍 GridGraph:Large-Scale Graph Processing on a Single Machine Using 2-Level Hierarchical Partitioning 图计算框架 图计算系统按照计算方式划分可分为:单机内存图处理系统,单机核外图处理系统,分布式内存图处理系统,分布式核外图处理系统。本文将详…

    算法与数据结构 2023年4月20日
    00
  • java数据结构基础:线性表

    Java数据结构基础:线性表 简介 线性表是指数据元素之间存在线性关系的数据结构,即数据元素之间有前后直接关系,且第一个元素没有前驱,最后一个元素没有后继。线性表可以用数组或者链表两种方式实现。 数组实现线性表 线性表的数组实现即为将线性表中的元素放在一个一维数组中,使用数组下标表示元素的位置。由于数组随机访问元素的时间复杂度为O(1),因此在随机访问比较多…

    数据结构 2023年5月17日
    00
  • 详解Pytorch中的tensor数据结构

    详解Pytorch中的Tensor数据结构 在Pytorch中,Tensor是一种重要的数据结构,它是一个多维数组(类似于NumPy的ndarray),并且支持GPU加速操作。在本文中,我们将详细介绍Pytorch中的Tensor数据结构,包括如何创建、初始化、检索和修改Tensor对象。 创建Tensor对象 创建Tensor对象的方法有很多种。以下是一些…

    数据结构 2023年5月17日
    00
  • C++深入浅出探索数据结构的原理

    标题:C++深入浅出探索数据结构的原理攻略 介绍 《C++深入浅出探索数据结构的原理》是一本深入讲解C++数据结构的书籍。在本攻略中,我们将介绍该书的主要内容和要点,以及学习该书的步骤和建议。 内容 该书分为三个部分,分别是数据结构的基础、线性表和树。 数据结构的基础 第一部分主要讲解数据结构的基础知识,包括算法分析、时间复杂度和空间复杂度等。这一部分对于初…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十九天–数据库(4)

    本篇攻略是针对Java数据库相关面试题的,为了方便浏览,我将其分为以下几个部分: 1. 数据库连接池 在Java开发中,我们使用JDBC连接数据库进行数据操作时,为了提高数据库访问性能,通常会使用数据库连接池技术。常见的数据库连接池有:C3P0、Druid、HikariCP等。 C3P0 C3P0是一个开源的数据库连接池,可以设置最大连接数、最小连接数、最大…

    数据结构 2023年5月17日
    00
  • C语言数据结构不挂科指南之线性表详解

    C语言数据结构不挂科指南之线性表详解 本篇攻略将为大家介绍C语言数据结构中的线性表,包括定义、实现和应用。希望能够为初学者提供帮助,让大家轻松学习和掌握线性表的相关知识。 一、线性表的定义 线性表是由一组元素构成的有限序列,其中每个元素可以有零个或一个前驱元素,也可以有零个或一个后继元素。线性表通常用于存储和处理具有相同类型的数据元素。 线性表的实现方式有多…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部