为什么我更喜欢使用vector来使queue

问题描述

| 以来 它们都是连续的内存容器; 从功能上来说,双端队列几乎具有向量所有的内容,但更多,因为在前端插入会更有效。 为什么有人会更喜欢
std::vector
而不是
std::deque
?     

解决方法

        “ 2”中的元素在内存中不连续;保证有3个元素。因此,如果您需要与需要连续数组的普通C库交互,或者如果您(非常)在意空间局部性,那么您可能更喜欢
vector
。另外,由于还有一些额外的簿记,所以其他操作可能(比)同等的“ 3”操作昂贵。另一方面,使用many3ѭ的很多实例都可能导致不必要的堆碎片(减慢对
new
的调用)。 另外,如StackOverflow上其他地方所指出的,此处还有更多精彩的讨论:http://www.gotw.ca/gotw/054.htm。     ,        要知道差异,应该知道通常是如何实现的。内存以大小相等的块分配,并且被链接在一起(作为数组或向量)。 因此,要找到第n个元素,请找到合适的块,然后访问其中的元素。这是恒定时间,因为它总是精确地是2次查找,但是仍然比向量还要多。
vector
可以与需要连续缓冲区的API一起使用,因为它们是C API或在获取指针和长度方面更具通用性。 (因此,您可以在其下方有一个向量或一个规则数组,然后从内存块中调用API)。
deque
最大的优点是: 从两端增加或缩小集合时 当您处理非常大的集合大小时。 在处理布尔值时,您真的想要布尔值而不是bitset。 其中第二个是鲜为人知的,但是对于非常大的集合来说: 重新分配的成本很大 查找连续内存块的开销非常有限,因此您可以更快地耗尽内存。 过去,当我处理大型集合并将其从连续模型转换为块模型时,在32位系统内存不足之前,我们能够存储大约5倍的大型集合。部分原因是,在重新分配时,实际上需要在复制元素之前存储旧块和新块。 综上所述,在使用“乐观”内存分配的系统上,遇到“ 1”字会给您带来麻烦。虽然尝试为大容量的3分配请求较大的缓冲区的尝试可能会在某个时候被13否决,但分配器的乐观性质很可能始终会允许对2所请求的较小缓冲区的请求,这就是说可能会导致操作系统终止试图获取某些内存的进程。它选择的任何一个都可能不太愉快。 在这种情况下,解决方法是设置系统级标志以覆盖乐观分配(并不总是可行的)或以某种方式手动管理内存,例如使用您自己的分配器检查内存使用情况或类似情况。显然不理想。 (谁可能会回答您的问题,以便选择向量...)     ,        我已经多次实现了向量和双端队列。从实现的角度来看,双端队列要复杂得多。这种复杂性将转化为更多的代码和更复杂的代码。因此,当您在向量中选择双端队列时,通常会看到一个命中的代码大小。如果您的代码仅使用vector擅长的事物(即push_back),那么您可能也会受到较小的速度影响。 如果您需要双头队列,那么双端队列无疑是赢家。但是,如果您要在背面进行大多数插入和擦除操作,vector将是明显的赢家。当您不确定时,请使用typedef声明容器(以便轻松地来回切换)并进行测量。     ,        
std::deque
不能保证连续的内存-索引访问通常会比较慢。双端队列通常实现为“向量列表”。     ,根据http://www.cplusplus.com/reference/stl/deque/,“与向量不同,双端队列不能保证其所有元素都位于连续的存储位置,从而消除了通过指针算法进行安全访问的可能性。” ” 双端队列比较复杂,部分原因是它们不一定具有连续的内存布局。如果需要该功能,则不应使用双端队列。 (以前,我的回答引起了标准化的不足(来自与上述相同的来源,“ deques可能由特定的库以不同的方式实现”),但是实际上几乎适用于任何标准库数据类型。)     ,        双端队列是一个序列容器,它允许随机访问其元素,但不能保证具有连续存储。     ,        我认为对每个案例进行性能测试的好主意。并根据此测试做出决策。 在大多数情况下,我更喜欢
std::deque
而不是
std::vector
。     ,        根据这些测试结果(带有源),您不希望使用向量来使出队列。 当然,您应该在您的应用程序/环境中进行测试,但总而言之: 所有的push_back基本相同 在双端队列中插入,擦除比列表快得多,并且比向量快一点 还有更多的思考,以及有关注释circular_buffer的说明。     ,        一方面,向量经常比双端队列快。如果您实际上并不需要双端队列的所有功能,请使用向量。 另一方面,有时您确实需要矢量无法提供的功能,在这种情况下,您必须使用双端队列。例如,我向任何人发起挑战,要求他们尝试尝试重写此代码,而无需使用双端队列,也无需极大地改变算法。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...