26

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

然后我从C++ STL中找到了该std::bitset对象,但我无法在运行时定义位集的大小。然后我发现有一个特殊的初始化程序将它们存储为位(而不是整个字节或 4 个字节),但后来在 Wikipedia 中找到了这一部分:std::vector<byte>

标准库vectorbool. 这种特殊化的描述表明实现应该打包元素,以便每个元素bool只使用 一位内存。这被广泛认为是一个错误。[...] C++ 标准委员会和库工作组之间普遍达成共识,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入。

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

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

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

4

7 回答 7

28

在《Effective STL》第 18条中,Scott Meyers 建议:“避免使用向量<bool>。”:

作为一个 STL 容器,vector<bool> 确实只有两点错误。首先,它不是 STL 容器。其次,它不包含布尔值。除此之外,没有什么可反对的。

于 2011-07-21T20:14:03.557 回答
20

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

不幸的是,它是标准的一部分:参见23.3.7(C++0x FDIS) 部分。

于 2011-07-21T20:07:02.117 回答
13

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

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

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

如果您可以忍受它,并且它满足对其他一切的需求,那么使用它是完全可以的。

于 2011-07-21T21:09:08.323 回答
11

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

于 2011-07-21T20:03:29.247 回答
3

正确使用 没有错vector<bool>,就像没有错一样auto_ptr- 只要您在继续之前知道缺点和惊喜。

于 2011-07-21T20:08:00.193 回答
2

I would suggest using the BITSCAN library, as an alternative to Boost:dynamic_bitset. A comparative survey can be found here.

于 2014-07-28T16:23:58.277 回答
1

一个替代方案可能是BitMagic,尽管我不确定它是否适用于 x86 以外的任何其他架构(它使用 SIMD 进行了高度优化)。

于 2011-07-21T20:33:11.590 回答