我正在使用用户定义的位数(我持有一个三维位数组,因此大小会立即增加 - 假设不小于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 ++标准的一部分吗?
如果他们的使用不可接受,是否有可接受的替代解决方案(我自己定义一个特殊的容器)?我自己也有一些想法,但我很好奇是否有人有更好的解决方案。此外,我想避免使用大型库(同样,我希望最终将此代码移植到微控制器)。
答案 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)
答案 6 :(得分:1)
替代方案可能是BitMagic,但我不确定它是否适用于除x86之外的任何其他架构(使用SIMD进行了大量优化)。