【问题标题】:Good sources to understand Containers了解容器的好资源
【发布时间】:2021-11-03 14:39:06
【问题描述】:

我正在研究容器及其不同的性能。
什么时候,对于vector,我读到类似

“插入后面以外的元素很慢”

但对于list

“任意点快速插入/删除”

我的问题是:

  • 向量与列表有何不同,以至于上面的两句话都成立?

  • 它的向量与列表的构建有何不同?

  • 是因为它们将元素存储在不同的内存部分吗?

我正在搜索一些资源以更好地理解这些概念。

【问题讨论】:

    标签: list vector containers


    【解决方案1】:

    所有示例都将链接到 C++ 语言,因为我相信它在那里得到了完美的描述

    向量

    向量与动态数组相同,具有调整自身大小的能力 在插入或删除元素时自动使用它们的 存储由容器自动处理。向量元素 被放置在连续的存储中,以便它们可以被访问和 使用迭代器遍历。在向量中,数据被插入到最后。 在末尾插入需要不同的时间,因为有时可能 需要扩展数组。删除最后一个元素只需要 恒定的时间,因为没有调整大小发生。插入和擦除 开始或中间在时间上是线性的。

    Vector 是动态数组,但它可以管理分配给自己的内存。这意味着您可以创建长度在运行时设置的数组,而无需使用 new 和 delete 运算符(显式指定内存的分配和释放)。

    列表

    列表是允许非连续内存的序列容器 分配。与向量相比,列表的遍历速度较慢,但​​一旦 位置已经找到,插入和删除很快。一般, 当我们说列表时,我们谈论的是双向链表。为实施 单链表,我们使用前向表。

    列表有两种类型:

    • Double linked list 其中每个元素的地址为 [next][previous],要访问第一个或最后一个元素,您可以使用特定函数(例如,在 C++ 中,列表中的 front() 或 back() - listName.front() 将返回第一个(0)列表中的元素),head.previous 指向NULLtail.next 指向NULL
    • Single linked list 每个元素只有链接(知道) 关于 [next] 元素,此列表中的最后一个元素指向 到NULL

    现在让我们回到你的问题:

    向量与列表有何不同 上面两句话是真的吗?向量是如何构建的 与列表不同?是不是因为他们将元素存储在 不同的内存部分?我正在搜索一些资源以更好地 理解这些概念。

    正如我所提到的,有 2 种类型的列表(单链接和双点赞),它们非常适合您:

    • 除了列表末尾之外,到处都有许多插入/删除;

    如果您打算这样做,您可以使用矢量:

    • 经常访问列表末尾的插入/删除元素;
    • 在随机位置访问元素(因为您可以使用[N] 在任意点访问元素,其中 N 是元素的索引/位置。

    而在 List 中,您需要使用迭代器来访问位置/索引 N 处的元素。

    所以 vector 是一个动态数组,当你访问它时它们往往会执行得更快(因为它没有额外的包装,你可以通过指针直接访问内存中的一个点)。

    列表是一个序列容器(因此这个容器对某些基本语言功能进行了包装),它通过为用户提供一些有用的方法来处理其元素而牺牲了一些点,以支持插入和删除的额外简单性。

    为了解决您的问题,我们可以得出以下结论:

    矢量

    插入除后面以外的元素很慢

    列表

    任意点快速插入/删除

    这可以通过它们的结构来判断。

    • Insertion List 中很快,因为它是一个链表,而且这个 意味着什么?确切地说,这意味着要进行唯一的更改 实现它是改变[previous ]的指针和 [next] 项目,我们完成了!
    • Vector 中,将元素插入到末尾以外的任何位置会花费更多时间。这可以通过数组概念来证明。如果您有一个包含一百万个元素的数组,并且想要替换/删除/插入数组最开头的元素,则需要更改被更改元素之后的每个元素的位置。

    列表与矢量图像:

    图片取自以下来源: singly linked list double linked list double linked list 2nd image vector

    另外,请尝试查看vector-vs-list-in-stl。他们的比较在那里得到了很好的描述。 + 浏览the-c-standard-template-library-stl,转到“容器”部分并检查描述及其方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多