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日

相关文章

  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解 什么是二叉树子结构 二叉树是一种数据结构,由包含根节点的节点组成,可以拓展为左子树和右子树。二叉树子结构指的是,在一棵二叉树中,具有连续节点的子树。 如何判断是否为二叉树子结构 对于一棵二叉树T和另外一棵二叉树S,我们可以判断S是否为T的子树,遵循以下判断原则: 如果树S为空,则表示S不是T的子树; 如果树S的根节点和树T…

    数据结构 2023年5月17日
    00
  • C语言线性表的链式表示及实现详解

    C语言线性表的链式表示及实现详解 什么是线性表 线性表是一种在计算机科学中常见的数据结构,它由一组连接在一起的元素组成,每个元素都包含前后指针以指向相邻的元素,从而构成一个连续的线性序列。线性表可以用来存储和处理一般数据集合。 链式存储结构 线性表的链式存储结构是由若干个结构体组成的链表,每个结构体都称为一个节点。每个节点包含两个字段:一个数据域用来存放数据…

    数据结构 2023年5月17日
    00
  • C语言实现学生信息管理系统(链表)

    C语言实现学生信息管理系统(链表) 简介 学生信息管理系统是管理学生的一种系统,可以实现添加、查找、删除和修改学生信息等功能。本文将使用C语言实现学生信息管理系统,并通过链表的方式进行实现。 前提条件 在开始之前,我们需要了解如下内容: C语言基础知识 链表的基本概念和使用 系统架构 学生信息管理系统主要包含以下几个模块: 学生信息结构体 添加学生信息 查找…

    数据结构 2023年5月17日
    00
  • 深入浅析C语言中堆栈和队列

    深入浅析C语言中堆栈和队列 堆栈(Stack) 堆栈是一种先进后出(Last In First Out,LIFO)的线性数据结构,只允许在一端进行插入和删除操作。堆栈在C语言中常用于函数调用时的参数传递、表达式求值和程序中断处理等场景。 实现堆栈的基本操作 下面是堆栈的基本操作,可以用数组来实现: 初始化 #define MAX_SIZE 100 // 假设…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表的查找和建立

    C语言数据结构之单链表的查找和建立 什么是单链表? 单链表是一种常见的数据结构,是由若干个节点(Node)组成的链式结构,每个节点存储着链表中的元素和指向下一个节点的指针。 单链表的优点是插入、删除元素简单,但是查找元素比较困难。 在C语言中,我们可以使用结构体来定义一个节点: struct ListNode { int val; struct ListNo…

    数据结构 2023年5月17日
    00
  • 一些常见的字符串匹配算法

    作者:京东零售 李文涛 一、简介 1.1 Background 字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说,所有字符串(通常来讲称其为模式)的出现。该模式表示为p=p[0..m-1];它的长度等于m。文本表示为t=t[0..n-1],它的长度等于n。两个字符串都建立在一个有限的字符集上。 一个比较常见…

    算法与数据结构 2023年4月25日
    00
  • 动态开点线段树&线段树合并学习笔记

    动态开点线段树 使用场景 \(4 \times n\) 开不下。 值域需要平移(有负数)。 什么时候开点 显然,访问的节点不存在时(只会在修改递归时开点)。 trick 区间里面有负数时,\(mid = (l + R – 1) / 2\)。 防止越界。 例如区间 \([-1,0]\)。 开点上限 考虑到 update 一次最多开 \(\log V\) 个点(…

    算法与数据结构 2023年4月17日
    00
  • Java深入了解数据结构之哈希表篇

    Java深入了解数据结构之哈希表篇 1. 哈希表的定义 哈希表(Hash Table),也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(Hash Function)。 哈希表是基于哈希函数实现的,哈希函数将关键字映射到哈希表中的位置,如果存在两个…

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