可变大小的位集

18

我正在练习一个关于数组的问题,需要找出其中的唯一元素。我的想法是找到数组中的最大元素,并为其定义一个位集(bitset)。但问题在于,位集需要使用一个常量值,那么如何克服这个问题呢?以下是我对此的一些疑问:

a) 我能否以任何方式使用变量大小来定义位集?
b) 如果不能,那么使用 vector<bool>vector<char> 是最好的方法是什么?
c) 我知道 boost 有一个动态位集,但由于我正在学习,我想知道其他方法。


3
请查看Boost.DynamicBitset - ildjarn
1个回答

21
std::bitset<N> 模板需要提前指定一个固定的大小。而 std::vector<bool> 则是 C++ 标准提供的一种可变长度的二进制向量。它提供了类似于 bitset 的功能,但可以动态增加或缩小。
对于使用 vector<char> 还是 vector<bool> 更好的问题:使用 vector<bool> 是实现目标的更直接方式。我建议先使用它,如果性能不足,则考虑切换到 vector<char>。一般来说,最好尝试先编写最简洁、最直接的实现,然后再进行优化。
希望这有所帮助!

3
这个说法更加强硬 - std::bitset 只能在静态已知大小的情况下使用。 - templatetypedef
再次感谢!还有一个疑问,当我只需要在大小未知的情况下找到唯一值时,在vector(bool)和vector(char)中哪种方法最好? - JackSparrow
另外,你应该知道关于 vector< bool > 的一件事是 & v[ n ] - & v[ 0 ] 可能不等于 n,而不是其他任何类型。 - borisbn
@borisbn 谢谢你的代码...但是为什么会出现对齐问题呢? - JackSparrow
@Himank 不是因为对齐问题,而是因为C++标准(23.2.4和23.2.5)规定:“向量的元素是连续存储的,这意味着如果v是一个vector<T,Allocator>,其中T是一些类型而不是bool,那么它遵循恒等式&v[n] == &v[0] + n,对于所有0 <= n < v.size()”。vector< bool >可以在一个字节中存储8个值。 - borisbn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接