两者都像堆栈一样。两者都有推送和弹出操作。
某些内存布局有区别吗?
答案 0 :(得分:16)
std::vector
相比, std::stack
具有多项辅助功能和修改操作。如果是std::stack
,您可能只需要系统地执行操作,您可以在最后一个元素上方push()
或在最后一个元素上pop()
。
std::vector
在这个意义上更灵活,它有多个操作,您可以在其间insert()
或erase()
之间。
重点是, std::stack需要提供底层容器。默认情况下,它是std::deque
,但它也可以是std::vector
或std::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:只能访问或删除容器中最近添加的元素。
如果你想要一个具有类似堆栈行为的容器,你应该使用一个堆栈,如果它对你来说特别重要,它只能表现为堆栈。如果你想要类似堆栈的行为,你应该使用一个向量,但也可能想要做一些事情,比如迭代元素或修改任意位置的元素等。