我被介绍给数组。比列表。比矢量。比堆栈和队列。它们都可以包含某种类型的内存。但是为什么会有这么多呢?
我读到添加或删除时列表更好,而在做其他事情时,矢量更好。但什么是堆栈和队列?那么std :: array呢?
是否有任何优秀和善良的程序员能够(简单地或具体地)解释差异,优点,缺点以及何时使用这些不同的容器?
答案 0 :(得分:12)
这些是您正在讨论的不同数据结构。那我们为什么要使用不同的呢?这样做的原因是不同的数据结构在不同的东西上都很好。
数据结构与其自身的不同之处在于它们的元素之间的关系以及可以对数据结构执行的操作。
对不同数据结构的不同操作可能具有不同的复杂性。复杂性衡量的是操作数量随着数据量的增加而增长的程度。
由于您的问题是关于C ++,我将讨论2个数据结构:向量和列表。 还有一个顺序容器 - deque,类似于vector,主要区别在于在前面插入元素等操作要快得多。
这是一个非常有用的数据结构,它是一个自动增长的数组。由于数组存储在连续的内存块中,因此某些操作的计算密集程度较低。
让我们看一下我们可以对矢量做的操作。
由于所有元素都在连续的内存块中,因此获取第n个元素为O(1)。
如果我们剩下空间,并且我们知道向量的大小,则此操作为O(1)。如果我们没有空间,我们需要分配更多空间,并将所有数据复制到新空间。这是O(n),但很少发生这种情况。
这涉及将插入位置之后的所有元素移动到右侧。这是O(n)
这种结构比矢量具有一些优势。元素不在连续的内存块中,这使插入操作更快。
要获取第n个元素,您必须从头开始遍历每个列表节点,直到到达第n个元素。该操作是O(n)
如果我们有一个指向最后一个元素的指针,则此操作为O(1)。
这涉及找到插入的位置 - O(n)并修复指针。这似乎是相同的复杂性,但是向量必须复制元素,而列表只查找正确的位置。如果我们想在一开始就插入一个元素,就会看到很大的不同。列表,必须通过任何内容,而向量必须移动几乎所有元素。
这些是容器适配器。它们包装上面的容器,实现更强的关系,并添加新的操作。
这两者之间的区别在于堆栈是LIFO - 后进先出,而队列是FIFO - 先进先出。不同的算法使用不同的数据结构,因为可用的操作更快。
答案 1 :(得分:2)
所以我会给出一个非常简短的答案:每个对象都有不同的目标和需求。
堆栈和队列是混淆某些访问方法的对象,通常允许更好的机制来实现并发。如果您需要按特定订单获取数据 - 堆栈和队列是您的对象。
Vector,至少在C语言中是一种数组实现,允许您在运行时增加和减少数组大小,而不会损害数组最重要的属性 - 在内存中是顺序的。
列表在内存中不是连续的,但是非常动态 - 以访问时间的代价(因为它们不是连续的),添加和删除项目的成本低于向量中的成本
总结:
如果您需要按照给定的顺序逐个获取项目 - 请使用队列。
如果您需要获取最先插入的最后一项 - 请使用堆栈。
如果您事先知道要使用的元素数量,并且订单无关紧要 - 请使用数组。
如果顺序无关紧要,并且元素的数量在运行时间发生变化,而添加/删除不经常,但查询数据是 - 使用向量。
如果有更多插入/删除然后查询 - 使用列表。 在列表中,您还可以通过指针更改来便宜地利用订单 - 因此也可以使用它。
这些都非常短暂而且根本没有......每个数据结构背后都有很多......
答案 2 :(得分:0)
是的,今天ISOCPP推出了全球统一的C ++常见问题解答,应该处理所有这些问题。您可以通过以下链接找到它:
您会发现几乎所有与C ++相关的常见问题解答。