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

C++ 向量和堆栈之间的主要区别是什么?,c++,stl,containers,C++,Stl,Containers,两者都像一堆。两者都有推送和弹出操作 某些内存布局是否存在差异?stack是一个堆栈。它只能推动和弹出。向量可以做其他事情,比如插入中间。这增加了灵活性,但降低了保证 例如,对于堆栈,如果将a推到后面,然后将B推到后面,则可以保证它们将按B的顺序删除,那么a.vector不能保证这一点。堆栈基本上是vector的特例。从理论上讲,向量可以按您的意愿增长。可以删除向量中任何索引处的元素。但是,在堆栈的情况下,您可以删除元素并仅在其顶部插入它们(因此是向量的特殊情况) 在许多提供堆栈实现的库中,它们

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


某些内存布局是否存在差异?

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


例如,对于堆栈,如果将a推到后面,然后将B推到后面,则可以保证它们将按B的顺序删除,那么a.
vector
不能保证这一点。

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


在许多提供堆栈实现的库中,它们通常继承自向量类/结构。我不确定,但我认为STL(C++)可以做到这一点。

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


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

std::vector
std::stack
相比,它具有多个可访问性和修改操作。如果是
std::stack
,您可能只需要以系统的方式执行操作,您可以将
push()
推到最后一个元素上方,或将
pop()
推到最后一个元素上方

std::vector
在这个意义上更灵活,它有几个操作,您可以在它们之间插入()或擦除()

主要的一点是,需要提供底层容器。默认情况下,它是
std::deque
,但也可以是
std::vector
std::list


另一方面,
std::vector
保证是一个连续数组,可以使用
操作符[]

访问它。我认为主要区别在于vector是一个基于范围的容器。由于其成员函数(如开始和结束),它可以很容易地使用。向量可以很容易地以{}形式启动。我们可以使用现代C++类基于范围的循环的新特性。
vector<int> vec{ 7, 3, 1, 9, 5 };
for ( auto &i : vec ) {
    std::cout << i << std::endl;
}
向量向量{7,3,1,9,5}; 用于(自动和输入:vec){ 标准::cout如建议:

堆栈是一种容器适配器,专门设计用于在后进先出(后进先出)环境中操作,其中元素仅从容器的一端插入和提取

这里的关键字是,因为在中,元素是从容器一端插入和提取的

你说向量和堆栈都像堆栈,但这只是部分正确。向量可以像堆栈一样工作,但它们也可以像堆栈一样工作,允许你在任何索引处插入、访问任何元素、迭代整个结构等

堆栈接受一个容器(例如向量),并且只允许与它进行堆栈式的交互。这有效地保证了与容器的所有交互都将遵循后进先出:只有容器中最近添加的元素才能被访问或删除


如果您想要一个具有类似堆栈行为的容器,那么如果它只具有堆栈的行为对您来说特别重要,那么您应该使用堆栈。如果您想要类似堆栈的行为,那么您应该使用向量,但也可能希望执行诸如迭代元素或修改任意位置的元素等操作。

对,我刚刚看到向量h作为一个可以从中间擦除的
erase
函数。堆栈没有这样的东西。:)所以,vector是一个灵活的堆栈。@Anisha:不,这是一个错误的假设。如果是这样的话,一个链接列表、一个简单数组、一个数据块都可以称为堆栈..rt?但是堆栈是为容器或数据结构定义的一组属性cture。如果为堆栈定义的属性的实现保持为真,则可以从上述数据结构创建堆栈。@ArunMu实际上是由堆栈定义的,我指的是称为堆栈的“容器”。@AnishaKaul:ohh。我刚才说的是,即使您为运算符[]添加了一个函数对于堆栈..它将不再是堆栈:)根据标准:)。我只是说..@AnishaKaul:如果您考虑的是任何接近继承堆栈容器的地方,那么Nooo….STL容器没有虚拟析构函数。我认为根据STL实现,这将是一项艰巨的任务…正确地保护堆栈属性您说:
主要的一点是,std::stack需要提供底层容器。
但是这个示例没有显示提供容器的任何额外工作?@AnishaKaul,这是因为默认情况下,
templateclass stack;
。因此,如果您不提供任何容器,它假定它是
std::deque
。有关更多信息,请参阅我在回复中发布的链接。好的,谢谢,容器可以更改!很好。Vector的默认容器是由new?AnishaKaul创建的动态数组,否
std::Vector
是一个独立的容器。它使用
std::allocator
,是的,它可能使用
new[]
@Anisha:当人们使用“container”这个词时,他们通常只指stl容器,下面是一个列表,列出了它们(尽管在C++11中添加了其他容器)Stacks default container是一个deque-
class container=deque
@Jesse有任何链接支持它吗?vector的默认容器是什么?这里是一个指向的链接。您还应该得到一个包含定义的。vector是标准stl容器之一,stack