【发布时间】:2021-11-03 14:39:06
【问题描述】:
我正在研究容器及其不同的性能。
什么时候,对于vector,我读到类似
“插入后面以外的元素很慢”
但对于list:
“任意点快速插入/删除”
我的问题是:
-
向量与列表有何不同,以至于上面的两句话都成立?
-
它的向量与列表的构建有何不同?
-
是因为它们将元素存储在不同的内存部分吗?
我正在搜索一些资源以更好地理解这些概念。
【问题讨论】:
标签: list vector containers
我正在研究容器及其不同的性能。
什么时候,对于vector,我读到类似
“插入后面以外的元素很慢”
但对于list:
“任意点快速插入/删除”
我的问题是:
向量与列表有何不同,以至于上面的两句话都成立?
它的向量与列表的构建有何不同?
是因为它们将元素存储在不同的内存部分吗?
我正在搜索一些资源以更好地理解这些概念。
【问题讨论】:
标签: list vector containers
向量与动态数组相同,具有调整自身大小的能力 在插入或删除元素时自动使用它们的 存储由容器自动处理。向量元素 被放置在连续的存储中,以便它们可以被访问和 使用迭代器遍历。在向量中,数据被插入到最后。 在末尾插入需要不同的时间,因为有时可能 需要扩展数组。删除最后一个元素只需要 恒定的时间,因为没有调整大小发生。插入和擦除 开始或中间在时间上是线性的。
Vector 是动态数组,但它可以管理分配给自己的内存。这意味着您可以创建长度在运行时设置的数组,而无需使用 new 和 delete 运算符(显式指定内存的分配和释放)。
列表是允许非连续内存的序列容器 分配。与向量相比,列表的遍历速度较慢,但一旦 位置已经找到,插入和删除很快。一般, 当我们说列表时,我们谈论的是双向链表。为实施 单链表,我们使用前向表。
列表有两种类型:
Double linked list 其中每个元素的地址为 [next]
和 [previous],要访问第一个或最后一个元素,您可以使用特定函数(例如,在 C++ 中,列表中的 front() 或 back() - listName.front() 将返回第一个(0)列表中的元素),head.previous 指向NULL,tail.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,转到“容器”部分并检查描述及其方法。
【讨论】: