我有std::bitset
但现在我想在其上使用STL算法。
我本来可以使用std::vector<bool>
,但我喜欢std::bitset
的构造函数,我想要std::bitset
的按位操作。
我是否必须通过循环并将所有内容都放在std::vector<bool>
中以使用STL算法,然后将其复制回std::bitset
,还是有更好的方法?
答案 0 :(得分:1)
如果您不想使用operator[]
的{{1}}来编写循环,那么您可以尝试使用bitset
将位集转换为bitset::to_string()
的字符串, '1'
。从C ++ 11开始,您实际上可以选择与这两个不同的字符,因此您实际上可以选择'0'
和'\0'
。
您确定'\1'
是您的任务的最佳类型吗?
答案 1 :(得分:0)
Matthew Austern在bitset
编写了一个迭代器:http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2
它超过100行,所以我觉得只是解除它并把它放在这个答案可能有点超出范围。但它对STL算法非常有效。
奥斯特恩回答了这个问题:
虽然bitset没有STL容器接口,但它仍然是一个非常好的(固定大小)容器。如果您使用bitset是有意义的,并且如果您还需要迭代器,那么您可以定义一个简单的“索引迭代器”适配器,它将像* i这样的迭代器表示法转换为数组表示法,如b [n]。实现很简单:维护索引和指向容器的指针。
他警告他的迭代器:
如果我们愿意接受稍微麻烦的接口,我们可以定义一个使用任意数组类型的类。通用索引迭代器适配器在处理pre-STL容器类时通常很有用,有时甚至在处理像vector这样的STL容器时也很有用。
还应注意,与vector<bool>::iterator
一样,Austern的bitset_iterator::operator*
不会返回bool&
,而是返回代理参考:bitset<>::reference
。
bitset_iterator
的用法如下所示:
std::bitset<10> foo;
std::vector<bool> bar(begin(foo), end(foo));