我有一个std::bitset
但现在我想在上面使用STL算法。
我本可以使用std::vector<bool>
,但我喜欢std::bitset
的构造函数,我想要std::bitset
的按位运算。
我是否必须通过循环并将所有内容填充到std::vector<bool>
中才能使用 STL 算法,然后将其复制回std::bitset
,或者有更好的方法?
如果您不想使用 bitset
的operator[]
编写循环,那么您可以尝试使用 bitset::to_string()
将位集转换为 '1'
和 '0'
的字符串。从 C++11 开始,您实际上可以选择与这两个不同的字符,因此您实际上可以选择 ' '
和 '1'
.
您确定bitset
是您任务的最佳类型吗?
Matthew Austern在这里为bitset
写了一个迭代器:http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2
有 100 多行,所以我觉得只是举起它并把它放在这个答案中可能有点超出界限。但它对 STL 算法非常有效。
Austern回答了这个确切的问题:
虽然 bitset 没有 STL 容器接口,但它仍然是一个非常好的(固定大小)容器。如果使用位集有意义,并且还需要迭代器,则可以定义一个简单的"索引迭代器"适配器,它将迭代器表示法(如 *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));