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

10
我有一个std::bitset,现在我想在其上使用STL算法。
我本可以使用std::vector代替,但我喜欢std::bitset的构造函数,并且我需要std::bitset的位运算。
我是否必须通过循环将所有内容放入std::vector以使用STL算法,然后将其复制回std::bitset,还是有更好的方法?

2
你想在位集合的位上使用什么算法? - wilx
@VáclavZeman 首先我想使用 std::reverse,但是当我发现 std::bitset 不允许我在其上使用 STL 算法时,我只是想找到一种通用的方法来使用它们。 - Jonathan Mee
1
你可以编写适当的迭代器和成对的独立 begin()end() 函数。 - milleniumbug
4
不应该在 bitset 上使用 std::algorithm,请参考 http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious。 - user2249683
@DieterLücking 非常惊人,谢谢。 - Jonathan Mee
2个回答

2

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

代码超过100行,所以我觉得直接复制粘贴到这个答案中可能有点超出范围。但是它对STL算法非常有效。

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

虽然bitset没有STL容器接口,但它仍然是一个完全好用的(固定大小)容器。如果您使用bitset有意义,并且如果您还需要迭代器,则可以定义一个简单的“索引迭代器”适配器,将迭代器符号(如*i)转换为数组符号(如b[n])。实现很简单:维护一个索引和一个指向容器的指针。

他警告了他的迭代器:

如果我们愿意接受稍微麻烦一些的接口,我们可以定义一个适用于任意类似数组的类型的类。当处理预-STL容器类时,通用索引迭代器适配器通常很有用,有时甚至在处理STL容器(如vector)时也很有用。

需要注意的是,就像使用vector<bool>::iterator一样,Austern的bitset_iterator::operator*也不返回bool&,而是代理引用:bitset<>::reference
使用bitset_iterator的方法如下:
std::bitset<10> foo;
std::vector<bool> bar(begin(foo), end(foo));

bitset似乎没有迭代器begin()和end(),因此上述方法不起作用。 - Naveen
1
重点是拥有一个特殊化的begin(),它返回一个bitset_iterator,这正是链接实现所包含的内容。 - Bruce Adams

2
如果您不想使用bitsetoperator[]写循环,那么可以尝试使用bitset::to_string()bitset转换为'1''0'的字符串。自C++11以来,您实际上可以选择与这两个字符不同的不同字符,因此您实际上可以选择'\0''\1'
您确定bitset是您的任务的最佳类型吗?

似乎使用循环比那个解决方案更好...我并不完全反对使用循环,只是感觉应该有更简洁的方法。至于使用std::bitset...我认为可以吧?在数字和数组之间灵活转换的能力是无法超越的。 - Jonathan Mee

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