C++ 11中的vector <char> VS vector <bool>

Nav*_*adi 5 c++ vector stdvector c++11

我们为什么要用vector<char>而不是vector<bool>vector<char>更快的原因是什么?

101*_*010 9

std::vector<bool>这是一项专门std::vector<T>针对空间效率(有争议)的专业化.但是,它的行为与常规相似但并不相同std::vector<T>.这主要归因于这样的事实:std::vector<bool>它不是通常的C++标准库意义上的容器,而是一个位数组.a std::vector<bool>和常规之间的一些区别std::vector是:

  • std::vector<bool>::iterator 不是随机访问迭代器.
  • std::vector<bool> 不需要将其元素存储为连续数组.
  • std::vector<bool>公开class std::vector<bool>::reference作为访问各个位的方法.特别是,这个类的对象被返回operator[],std::vector<bool>::front,std::vector<bool>::back按值.
  • std::vector<bool>std::allocator_traits::construct用于构造位值.
  • std::vector<bool> 不保证同一容器中的不同元素可以由不同的线程同时修改.
  • std::vector<bool>有一个不同的界面(即flip())

除了打破std::vector作为连续容器的概念含义之外,这些差异也会破坏用户代码,特别是当此代码是通用的(即模板代码)时.

为了澄清,请考虑以下示例:

template<class T> void foo(std::vector<T> &v) {
 T &frnt = v.front();
 ...
}
Run Code Online (Sandbox Code Playgroud)

以上示例适用于T除以外的所有内容T = bool.正如已经提到的,这种失败的原因是v.front()返回的值是临时的(按值返回),因此不能绑定到引用.

为了避免这种破坏,许多程序员避免使用std::vector<bool>和更喜欢使用std::vector<char>.由于引起的许多问题,许多人表示使用std::vector<bool>可以被认为是过早的优化.为解决这个问题,许多杰出的C++社区成员提出了建议.其中一个提议建议以std::vector<bool>不同的名称删除它不会引用C++标准库容器.

现在到时间性能问题,主要问题std::vector<bool>是它的各自std::algorithm算法没有针对它进行优化.因此,尽管您可以通过使用它来获得空间,但它的使用可能会导致非常显着的速度悲观.

参考书目

  1. 矢量:更多问题,更好的解决方案,草药Sutter
  2. vector<bool>,霍华德Hinnant
  3. std::vector<bool>


Jon*_*eld 5

vector<bool>是一个位数组.vector<char>是一个字节数组.前者使用较少的空间来换取更复杂的索引操作.

vector<char>实际上是否更快可能是体系结构的功能,尤其是缓存.如果你vector<bool>完全适合x86_64上的L1缓存,那么它可能比vector<char>没有的更快.

如果表现很重要,通常的建议适用于衡量您申请中的表现.