繁体   English   中英

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

[英]What is the major difference between a vector and a stack?

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

一些内存布局有区别吗?

std::stack相比, std::vector有几个可访问性和修改操作。 对于std::stack ,您可能只需要以系统方式执行操作,您可以在最后一个元素上方push()或在最后一个元素上使用pop()

std::vector在这个意义上更灵活,它有几个操作,你可以在其间insert()或在其间insert() erase()

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

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

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

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

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

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

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

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

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

而std :: stack是不可能的。

正如cplusplus.com建议的那样:

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

这里的关键词只是 ,因为元素只是从容器的一端插入和提取。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM