两者都像堆栈一样。它们都具有推入(push)和弹出(pop)操作。
它们的区别在于内存布局吗?
std::vector
相比于std::stack
具有多个可访问性和修改操作。在std::stack
的情况下,您可能只能以系统方式执行操作,其中可以在最后一个元素上方push()
或弹出pop()
最后一个元素。
std::vector
在这方面更加灵活,它具有多个操作,其中可以在中间进行insert()
或erase()
。
主要的问题是,std::stack需要提供基础容器。默认情况下,它是std::deque
,但也可以是std::vector
或std::list
。
另一方面,std::vector
保证是一个连续的数组,可以使用operator []
进行访问。
template < class T, class Container = deque<T> > class stack;
。所以如果你不提供任何容器,它就会假定为std::deque
。请参见我在答案中发布的链接以获取更多信息。 - iammilindstd::vector
是一个独立的容器。它使用 std::allocator
,并且可能会使用 new[]
。 - iammilind我不了解所有实现细节,但根据这个链接,栈是一个容器适配器。它确保底层容器(可以是向量、链表或双端队列)工作为一个栈,即只允许推入和弹出,而不允许随机访问。
所以,向量可以作为栈来使用,但栈不能像向量一样使用,因为您无法在随机位置插入或获取元素。
stack
是一个栈。它只能进行推入和弹出操作。而vector
可以做其他的事情,比如在中间插入元素。这增加了灵活性,但降低了保证。
例如,在栈中,如果你将A和B依次推入栈中,那么保证它们会以B、A的顺序被弹出。但是vector
不能保证这一点。
erase
函数可以从中间删除元素。而栈没有这样的功能。:) 所以,vector 是一个灵活的栈。 - Aquarius_Girl栈基本上是向量的一种特殊情况。理论上,向量可以随意增长。您可以在向量中的任何索引处删除元素。然而,在栈的情况下,只能在其顶部删除和插入元素(因此是向量的一种特殊情况)。
实际上,在许多提供栈实现的库中,它们通常继承自向量类/结构。我不确定,但我认为STL(C ++)就是这样做的。
stack
没有被定义为继承自 vector
;它是一个模板适配器,默认情况下使用 deque
,可以选择 vector
作为选项。 - underscore_d正如cplusplus.com所建议:
堆栈是一种容器适配器,专门设计用于LIFO上下文(后进先出),其中元素仅从容器的一端插入和提取。
关键词在于only,即元素只能从容器的一端插入和提取。
你说向量和堆栈都像堆栈一样,但这只是部分正确。向量可以像堆栈一样运作,但它们也可以非常不像堆栈,例如允许您在任何索引处插入,访问任何元素,迭代整个结构等等。
堆栈接受一个容器(例如向量)并且只允许堆栈式的交互。这有效地保证与容器的所有交互都将遵守LIFO:只有最近添加的元素才能被访问或删除。
如果您需要一个类似堆栈的容器,那么如果对于它的行为必须是纯粹的堆栈,您应该使用堆栈。如果您想要类似堆栈的行为,但也可能想要做像迭代元素或修改任意位置的元素等其他操作,则应使用向量。我认为主要的区别在于向量是基于范围的容器。由于其成员函数(如begin和end),它可以很容易地使用。向量可以很容易地使用{}形式进行初始化。我们可以使用现代C++的新功能,如基于范围的循环。
vector<int> vec{ 7, 3, 1, 9, 5 };
for ( auto &i : vec ) {
std::cout << i << std::endl;
}
虽然 std::stack 不支持此操作。
std::stack
的人已经知道他们不关心基于范围的迭代;相反,他们想要一个简洁的接口来按照明确定义的顺序推入和弹出元素。 - underscore_d
class Container = deque<T>
。 - Jesse Good