在标准::位集和标准::矢量<bool>之间转换

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

本文关键字:标准 bool 转换 之间 gt 矢量 lt      更新时间:2023-10-16

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

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

我是否必须通过循环并将所有内容填充到std::vector<bool>中才能使用 STL 算法,然后将其复制回std::bitset,或者有更好的方法?

如果您不想使用 bitsetoperator[]编写循环,那么您可以尝试使用 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));