C++ 向量与德克的区别

C++ 向量与德克的区别,c++,c++11,vector,deque,C++,C++11,Vector,Deque,Asvector和deque都提供了一个函数,可以在最后一步将元素向后推 其中deque还提供了一个功能push_front以在开头插入元素,这在vector的情况下成本有点高 我的问题是,什么时候我们可以通过使用deque实现vector的相同功能(push_back),那么为什么需要vector 向量和deques之间的一个主要区别是后者允许在结构的前部和后部有效插入 DEQUE也不能保证它们的元素在内存中是连续的,因此at样式操作符(索引)可能没有那么有效 请注意,对于较小的集合,这种差异

As
vector
deque
都提供了一个函数,可以在最后一步将元素向后推

其中
deque
还提供了一个功能
push_front
以在开头插入元素,这在
vector
的情况下成本有点高


我的问题是,什么时候我们可以通过使用
deque
实现
vector
的相同功能(
push_back
),那么为什么需要
vector

向量和deques之间的一个主要区别是后者允许在结构的前部和后部有效插入

DEQUE也不能保证它们的元素在内存中是连续的,因此at样式操作符(索引)可能没有那么有效


请注意,对于较小的集合,这种差异实际上不太重要,但通常在集合大小增加或每秒修改多次时会变得更重要。

std::deque
是一个双端队列。它还可以在开始时有效地插入和删除元素,而不仅仅是在结束时,正如
std::vector
所做的那样。向量保证将元素存储在连续存储器中,因此您可以通过索引/偏移量访问其元素
std::deque
不提供此担保

主要是性能。
std::deque
具有所有 std::vector的功能,至少用于正常使用,但 对其进行索引和迭代通常会有些困难 更慢的;如果您已经完成了,那么在末尾追加也可能是一样的 已使用
保留
。当然,
std::vector
是默认值 容器,使用任何其他内容都会向读者建议 你有特殊要求

std::vector
还保证了连续性,因此它(并且只有它) 可用于接口需要
T*
T常量*

我可以补充一点,那一次我真的有一场演出 经测量,
std::vector
std::deque
快, 尽管事实上我经常从 前面(使用容器作为队列,在后面推, 和在前面弹出)。我不知道这是否概括了, 然而;在我的例子中,队列相对较短(从未超过) 比大约15个元素,通常少很多),以及 WARE
char
,复制成本极低。但总的来说,, 即使需要从中删除元素,我也会使用
std::vector
前线,如果只是因为它的地理位置更好的话。我可能会 只考虑<代码> STD::DeQue/Cuth>如果我期望成千上万的元素,
复制成本很高。

。有效的插入取决于。如果没有太多的元素,并且它们的复制成本也不太高,那么在
std::vector
中,如果您的结构只包含很少的元素,那么在前面插入比在
std::deque
@James中插入更便宜,您也可以使用数组,而不必为集合费心:-)我考虑的更多是更大的集合,在这些集合中,deque更有可能更有效地进行前端插入。但是你提出了一个很好的观点,所以我要加上它。@paxdiablo问题是:什么时候一个容器变得足够大,足以证明这种差异。很久以前,我的一位同事测量了移动一百万字节所需的时间,结果令人惊讶地低(但当时缓存内存和潜在的未命中并未发挥作用)。最后,我没有任何真正的答案:对于10
char
,使用C风格的数组或
std::vector
(或C++11中的
std::array
)。对于执行深度复制(分配等)的数百万个元素,请使用
std::deque
。中间的某个地方是分界线,但我不知道在哪里。请注意,如果要保留指向元素的指针,则必须使用vector,因为deque将被移动,从而导致指针无效。您还可以使用
[]
at()
访问
deque
的元素。在这个级别上,接口没有区别。我实现了一个由100个元素组成的FIFO结构,用于缓冲一些输入传感器数据。我使用deque实现,将新引入的元素向后推,当大小达到100时弹出前端。您认为这是一个可接受的架构选择吗?我想知道您对实现用于缓冲传感器数据的先进先出结构的更好方法的看法。先谢谢你