什么是堆栈、队列、向量、数组和列表?

What is a Stack, Queue, Vector, Array and List?

本文关键字:列表 数组 队列 堆栈 什么 向量      更新时间:2023-10-16

我被介绍到数组。比列表。比向量。然后是堆栈和队列。它们都可以包含某种类型的记忆。但为什么会有这么多呢?

我读到列表在添加或删除时更好,而在做其他事情时,vector更好。但是什么是堆栈和队列呢?那么std::array呢?

是否有优秀的程序员可以(简单地或具体地)解释这些不同容器的区别、优点、缺点以及何时使用这些不同容器?

这是你所谈论的不同的数据结构。那我们为什么要用不同的呢?这样做的原因是不同的数据结构擅长不同的事情。

数据结构的不同之处在于其元素之间的关系,以及可以在数据结构上执行的操作。

对不同数据结构的不同操作具有不同的复杂度。复杂度是指随着数据量的增加,操作的数量增加了多少。

既然你的问题是关于c++的,我将谈谈两种数据结构:向量和列表。还有一种顺序容器——deque,它与vector容器类似,主要区别在于在容器前面插入元素等操作要快得多。

<<h2>向量/h2>

这是一个非常有用的数据结构,它是一个自动增长数组。由于数组存储在连续的内存块中,因此某些操作的计算量比其他操作少。

让我们看一下可以在向量上做的运算。

元素访问

由于所有元素都在一个连续的内存块中,所以获取第n个元素是O(1)。

添加到结束

如果我们有剩余的空间,并且我们知道向量的大小,这个操作是O(1)。如果我们没有空间,我们需要分配更多的空间,并将所有数据复制到新的空间。这是O(n),但这种情况很少发生。

插入和删除

这涉及到将插入位置之后的所有元素向右移动。这是O(n)

列表

与vector相比,该结构有一些优点。元素不在连续的内存块中,这使得插入操作要快得多。

元素访问

要到达第n个元素,必须从头遍历每个列表节点,直到到达第n个元素。该操作为O(n)

添加到结束

如果指针指向最后一个元素,则该操作为0(1)。

插入和删除

这包括找到插入的位置- 0 (n)和修复指针。这似乎是相同的复杂性,但vector必须复制元素,而list只查找正确的位置。如果我们想在最开始插入一个元素,就会看到很大的不同。list不需要遍历任何元素,而vector几乎需要移动所有元素。

堆栈和队列

这些是容器适配器。它们包装了上述容器,实现了更强的关系,并添加了新的操作。

这两者之间的区别在于堆栈是后进先出的LIFO,而队列是先进先出的FIFO。不同的算法使用不同的数据结构,因为可用的操作更快。

所以我将给出一个非常简短的答案:每个对象都有不同的目标和需求。

stack和queue是混淆一些访问方法的对象,通常允许更好的机制来实现并发。如果你需要按特定的顺序获取数据,堆栈和队列是适合你的对象。

Vector,至少在C语言中是一个基于数组的实现,它允许你在运行时增加和减少数组的大小,而不会损害数组最重要的属性——在内存中是顺序的。

列表在内存中不是顺序的,但非常动态——添加和删除项的成本比vector要低,但代价是访问时间(因为它们不是顺序的)

总结:

如果您需要按照给定的顺序逐个获取项目,请使用queue。

如果你需要先得到最后一个被插入的元素,使用stack

如果您事先知道要使用的元素的数量,并且它们的顺序完全无关紧要,则使用数组。

如果顺序无关紧要,并且元素的数量在运行时变化,而添加/删除不经常,但查询数据是-使用vector。

如果有更多的插入/删除,那么查询-使用列表。在列表中,你也可以通过改变指针来便宜地利用顺序——所以这也可以用于它。

这些都很短,根本没有通过…每个数据结构背后都有更多的内容……

是的,今天ISOCPP已经发布了世界统一的c++常见问题解答,应该可以解决所有这些问题。你可以从下面的链接找到它:

http://isocpp.org/faq

你会发现几乎所有与c++相关的常见问题解答