我们为什么要用vector
而不是vector
?vector
更快的原因是什么?
std::vector
这是一项专门std::vector
针对空间效率(有争议)的专业化.但是,它的行为与常规相似但并不相同std::vector
.这主要归因于这样的事实:std::vector
它不是通常的C++标准库意义上的容器,而是一个位数组.a std::vector
和常规之间的一些区别std::vector
是:
std::vector
不是随机访问迭代器.
std::vector
不需要将其元素存储为连续数组.
std::vector
公开class std::vector
作为访问各个位的方法.特别是,这个类的对象被返回operator[]
,std::vector
,std::vector
按值.
std::vector
不std::allocator_traits::construct
用于构造位值.
std::vector
不保证同一容器中的不同元素可以由不同的线程同时修改.
std::vector
有一个不同的界面(即flip()
)
除了打破std::vector
作为连续容器的概念含义之外,这些差异也会破坏用户代码,特别是当此代码是通用的(即模板代码)时.
为了澄清,请考虑以下示例:
templatevoid foo(std::vector &v) { T &frnt = v.front(); ... }
以上示例适用于T
除以外的所有内容T = bool
.正如已经提到的,这种失败的原因是v.front()
返回的值是临时的(按值返回),因此不能绑定到引用.
为了避免这种破坏,许多程序员避免使用std::vector
和更喜欢使用std::vector
.由于引起的许多问题,许多人表示使用std::vector
可以被认为是过早的优化.为解决这个问题,许多杰出的C++社区成员提出了建议.其中一个提议建议以std::vector
不同的名称删除它不会引用C++标准库容器.
现在到时间性能问题,主要问题std::vector
是它的各自std::algorithm
算法没有针对它进行优化.因此,尽管您可以通过使用它来获得空间,但它的使用可能会导致非常显着的速度悲观.
矢量:更多问题,更好的解决方案,草药Sutter
在vector
,霍华德Hinnant
std::vector
vector
是一个位数组.vector
是一个字节数组.前者使用较少的空间来换取更复杂的索引操作.
vector
实际上是否更快可能是体系结构的功能,尤其是缓存.如果你vector
完全适合x86_64上的L1缓存,那么它可能比vector
没有的更快.
如果表现很重要,通常的建议适用于衡量您申请中的表现.