解决方法
> std :: vector< bool> :: iterator不是随机访问迭代器.
> std :: vector< bool>不需要将其元素存储为连续数组.
> std :: vector< bool>暴露类std :: vector< bool> :: reference作为访问各个位的方法.特别是,此类的对象由operator [],std :: vector< bool> :: front,std :: vector< bool> ::返回值返回.
> 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(); ... }
以上示例适用于每个T,除非T = bool.如前所述,这种失败的原因是v.front()的返回值是临时值(按值返回),因此无法绑定到引用.
为了避免这种破坏,许多程序员避免使用std :: vector< bool>并且更喜欢使用std :: vector< char>.由于引起的许多问题,许多人都说过使用std :: vector< bool>可以被视为过早的优化.为解决这个问题,许多杰出的C社区成员提出了建议.其中一个建议建议删除std :: vector< bool>在不同的名称下,它不会引用C标准库容器.
现在到时间性能问题,std :: vector< bool>的主要问题是它的各自的std :: algorithm算法没有针对它进行优化.因此,尽管您可以通过使用它来获得空间,但它的使用可能会导致非常显着的速度悲观.
参考书目
> vector: More Problems,Better Solutions,Herb Sutter
> On vector<bool>
,Howard Hinnant
> std::vector<bool>