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

时间:2015-01-07 18:43:06

标签: c++ vector boolean bitset stl-algorithm

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

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

我是否必须通过循环并将所有内容都放在std::vector<bool>中以使用STL算法,然后将其复制回std::bitset,还是有更好的方法?

2 个答案:

答案 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));
相关问题