向量和堆栈之间的主要区别是什么?

时间:2012-01-09 08:55:57

标签: c++ stl containers

两者都像堆栈一样。两者都有推送和弹出操作。

某些内存布局有区别吗?

6 个答案:

答案 0 :(得分:16)

std::vector相比,

std::stack具有多项辅助功能和修改操作。如果是std::stack,您可能只需要系统地执行操作,您可以在最后一个元素上方push()或在最后一个元素上pop()

std::vector在这个意义上更灵活,它有多个操作,您可以在其间insert()erase()之间。

重点是, std::stack需要提供底层容器。默认情况下,它是std::deque,但它也可以是std::vectorstd::list 另一方面,std::vector保证是一个连续的数组,可以使用operator []访问。

答案 1 :(得分:13)

我不知道所有的实现细节,但根据this,stack是一个容器适配器。它确保底层容器(可以是向量,列表或双端队列)作为堆栈工作,即仅允许推送和弹出,而不是随机访问。

因此,向量可以作为堆栈工作,但堆栈不能用作向量,因为您无法在随机位置插入或获取元素。

答案 2 :(得分:9)

stack是一个堆栈。它只能推动和弹出。 vector可以做其他事情,比如插入中间。这增加了灵活性,但减少了保证。

例如,对于堆栈,如果您将A然后B推到后面,那么您可以保证它们将按顺序B移除,然后是A. vector不能保证。

答案 3 :(得分:2)

Stack基本上是vector的一个特例。从理论上讲,矢量可以随意增长。您可以删除向量中任何索引处的元素。但是,在堆栈的情况下,您可以删除元素并仅将其插入其顶部(因此是矢量的特殊情况)。

面对许多提供堆栈实现的库,它们通常从vector类/结构继承。我不确定,但我认为STL(C ++)可以做到。

答案 4 :(得分:0)

我认为主要区别在于vector是一个基于范围的容器。由于其成员函数(如begin和end),它可以很容易地使用。可以使用{}形式轻松启动矢量。我们可以使用现代C ++的新功能,例如基于范围的循环。

vector<int> vec{ 7, 3, 1, 9, 5 };
for ( auto &i : vec ) {
    std::cout << i << std::endl;
}

而std :: stack是不可能的。

答案 5 :(得分:0)

正如cplusplus.com所暗示:

  

Stacks是一种容器适配器,专门设计用于在LIFO上下文中操作(后进先出),其中元素仅从容器的一端插入和提取。

此处的关键词是,因为元素插入并从容器的一端提取。

你说两个向量和堆栈都像堆栈一样,但这只是部分正确。向量可以像堆栈一样运行,但它们也可以像堆栈一样,通过允许你执行诸如插入任何索引,访问任何元素,遍历整个结构等等。 / p>

堆栈采用容器(例如,向量)并且仅允许与堆栈类似的交互。这有效地保证了与容器的所有交互都将遵循LIFO:只能访问或删除容器中最近添加的元素。

如果你想要一个具有类似堆栈行为的容器,你应该使用一个堆栈,如果它对你来说特别重要,它只能表现为堆栈。如果你想要类似堆栈的行为,你应该使用一个向量,但也可能想要做一些事情,比如迭代元素或修改任意位置的元素等。