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日

相关文章

  • C++20中的结构化绑定类型示例详解

    ” C++20中的结构化绑定类型示例详解 ” 具体攻略如下: 什么是结构化绑定类型? 结构化绑定类型是C++17中的新特性,它可以让我们将一个复杂类型的元素绑定到某个变量上,从而更方便地使用这些元素。 C++20还进一步扩展了结构化绑定类型的功能,可以通过给用于引用的名字声明类型来进行显式类型的绑定。 结构化绑定类型的基本用法 下面的例子展示了如何使用结构化…

    数据结构 2023年5月17日
    00
  • C利用语言实现数据结构之队列

    C语言实现队列的完整攻略 什么是队列 队列是一种线性数据结构,它有两个端点:队头和队尾。新的元素插入到队尾,每次从队头取出一个元素。这就类似于人们排队买票,新的买票者排在队尾,每当售票员完成一笔交易,队列头的买票者出队。 基本操作 队列主要有以下3个基本操作: 入队(enqueue):将一个元素添加到队列的尾部 出队(dequeue):从队列的头部移除一个元…

    数据结构 2023年5月17日
    00
  • Codeforces Round 871 (Div. 4)

    A.Love Story 题意: 给定n个长度为10的字符串,问其与codeforces字符串的对应下标字母不同的个数。 分析: 对于每个字符串从前往后依次和“codeforces”对应字符比较然后统计不同字母数即可 code: #include <bits/stdc++.h> using namespace std; int main() { …

    算法与数据结构 2023年5月8日
    00
  • 浅谈Java数据结构之稀疏数组知识总结

    浅谈Java数据结构之稀疏数组知识总结 稀疏数组的定义 稀疏数组是指当一个数组中大部分元素是相同的值时,可以使用稀疏数组来保存该数组。稀疏数组的必要性在于节省内存空间,当数组中元素过多时,存储数组所需的内存空间也呈指数级增长。 稀疏数组的特点 稀疏数组存储的是一个原始的二维数组。 稀疏数组的第一行保存原始数组的基本信息,包括行数、列数、有效值的个数。 稀疏数…

    数据结构 2023年5月17日
    00
  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 什么是快速排序? 快速排序(Quicksort)是一种采用分治法(Divide and Conquer)的排序算法,通过将一个大问题逐步分解为小问题来解决的一种工具。 快速排序是一个比较快的排序算法,在平均状况下,排序n个项目要 O(n log n) 次比较,最坏情况下需要O(n^2)次比较,但这种状况并不常见。 快速排序算…

    数据结构 2023年5月17日
    00
  • Java矢量队列Vector使用示例

    Java矢量队列Vector使用示例 Java中的Vector是一个可调整大小的数组实现,与ArrayList类似,但是可以支持同步。在需要线程安全时,可以使用Vector代替ArrayList。 Vector的创建 使用Vector需要先导入Java.util.Vector类,然后可以使用以下代码创建一个Vector: Vector<Object&g…

    数据结构 2023年5月17日
    00
  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java Concurrency集合之LinkedBlockingDeque_动力节点Java学院整理 LinkedBlockingDeque是什么? LinkedBlockingDeque是java.util.concurrent包下一个双向阻塞队列,用于在多线程的环境中处理元素序列,它支持在队列两端添加和移除元素。LinkedBlockingDeque可…

    数据结构 2023年5月17日
    00
  • 「枚举」组合的输出

    本题为3月23日23上半学期集训每日一题中B题的题解 题面 (写题解的时候学校oj已不可查看此题,下面的题面来自洛谷第1157题) 题目描述 排列与组合是常用的数学方法,其中组合就是从 \(n\) 个元素中抽出 \(r\) 个元素(不分顺序且 \(r \le n\)),我们可以简单地将 \(n\) 个元素理解为自然数 \(1,2,\dots,n\),从中任取…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部