在C ++中使用std :: vector <bool>对象是否可以接受,或者我应该使用替代方法吗?</bool>

时间:2011-07-21 19:59:03

标签: c++ stl vector boolean bitset

我正在使用用户定义的位数(我持有一个三维位数组,因此大小会立即增加 - 假设不小于512位),并且需要逐个翻转它们。现在,只是在计算机上,我使用bool类型,因为内存不是问题。我计划将来将代码移到微控制器上,因此处理能力和内存要求可能是一个问题。但是现在,我只想要速度。

然后我从C++ STL找到了std::bitset对象,但我无法在运行时定义bitset的大小。然后我发现std::vector<byte>有一个特殊的初始化器将它们存储为位(而不是整个字节,或4个字节),然后在维基百科中找到this section

  

标准库定义了vector模板的特化   为bool。这种专业化的描述表明了   实现应该打包元素,以便每个bool仅使用   一位的内存。这被普遍认为是一个错误。 [...] C ++标准委员会和图书馆工作组之间达成​​了一致意见,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入。

现在,您可能会看到我想要使用vector<bool>对象,但在阅读之后,我正在考虑使用其他内容。唯一的问题是我不确定要使用什么。我很好奇为什么他们说明应该重新引入的功能(虽然名称不同)。

所以,我的问题是,vector<bool>对象的使用是否可以接受(因为它们是STL的一部分)?它们是C ++标准的一部分吗?

如果他们的使用不可接受,是否有可接受的替代解决方案(我自己定义一个特殊的容器)?我自己也有一些想法,但我很好奇是否有人有更好的解决方案。此外,我想避免使用大型库(同样,我希望最终将此代码移植到微控制器)。

7 个答案:

答案 0 :(得分:23)

In "Effective STL," Item 18,Scott Meyers建议:“避免使用vector&lt; bool&gt ;.”:

  

作为一个STL容器,实际上只有两件事有问题   矢量&lt; bool&gt;。首先,它不是STL容器。其次,它没有   抱着bools。除此之外,没有太多反对意见。

答案 1 :(得分:19)

vector<bool>没有任何问题,除了它不等于vector<T> T是与bool等效的整数类型。这仅表现在性能上(CPU一次仅访问字节,其中vector<bool>每个元素存储在一个位中)和内存访问(对vector<bool>的第一个元素的引用不等效与任何其他vector<T>一样的数组。

遗憾的是,这是标准的一部分:请参阅23.3.7部分(C ++ 0x FDIS)。

答案 2 :(得分:11)

boost.dynamic_bitset与std :: bitset几乎相同,只是它的大小是在运行时给出的。如果你对boost依赖不感兴趣,它的源代码(完全包含在它的头文件中)至少可以提供关于如何编写这样的容器的更多想法。

答案 3 :(得分:10)

批评是vector<bool>完全符合标准容器要求的唯一标准容器。这有点意外。

另一点是,vector<bool>强制对每个人进行空间优化(通过存储位),或许某些用户更喜欢速度优化。

除此之外,主要的偏差是容器不能返回对其成员的引用,因为它不存储任何bool。这将使奇数标准库算法无法为vector<bool>编译。

如果你能接受它,并且它符合你对其他一切的需求,那么就可以使用它了。

答案 4 :(得分:3)

正确使用vector<bool>并没有任何问题,就像auto_ptr没有任何问题一样 - 只要你在继续之前就知道它们的缺点和惊喜。

答案 5 :(得分:3)

我建议使用BITSCAN库作为Boost的替代方法:dynamic_bitset。可以找到比较调查here

答案 6 :(得分:1)

替代方案可能是BitMagic,但我不确定它是否适用于除x86之外的任何其他架构(使用SIMD进行了大量优化)。