在 std::bitset 和 std::vector<bool> 之间转换

Converting Between std::bitset and std::vector<bool>

我有一个 std::bitset 但现在我想在上面使用 STL 算法。

我本可以使用 std::vector<bool>,但我喜欢 std::bitset 的构造函数,我想要 std::bitset 的按位运算。

我是否必须通过一个循环将所有内容都塞入 std::vector<bool> 才能使用 STL 算法,然后将其复制回 std::bitset,还是有更好的方法?

如果你不想使用bitsetoperator[]写循环,那么你可以尝试使用bitset::to_string()将bitset转换为[=13=的字符串] 和 '0'。从 C++11 开始,您实际上可以选择与这两个字符不同的字符,因此您实际上可以选择 '[=15=]'''.

您确定 bitset 是您任务的最佳类型吗?

Matthew Austern 在这里为 bitset 写了一个迭代器:http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2

超过100行,我觉得只是把它举起来放在这个答案中可能有点越界。但它对 STL 算法非常有效。

Austern 回答了这个确切的问题:

While bitset doesn’t have the STL container interface, it’s still a perfectly good (fixed-size) container. If it makes sense for you to use a bitset, and if you also need iterators, then you can define a simple “index iterator” adaptor that translates iterator notation like *i into array notation like b[n]. The implementation is straightforward: maintain an index and a pointer to a container.

他确实警告他的迭代器:

If we were willing to accept a slightly more cumbersome interface, we could define a class that worked with arbitrary array-like types. A general purpose index iterator adaptor is often useful when dealing with pre-STL container classes, and sometimes even when dealing with STL containers like vector.

还应注意,与 vector<bool>::iterator 一样,Austern 的 bitset_iterator::operator* 不是 return bool& 而是代理参考:bitset<>::reference.

bitset_iterator 的用法如下所示:

std::bitset<10> foo;
std::vector<bool> bar(begin(foo), end(foo));