在标准::位集和标准::矢量<bool>之间转换
Converting Between std::bitset and std::vector<bool>
我有一个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));
- 写入向量<向量<bool>>
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 从标准::字符串到标准::矢量<bool>的快速转换
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 从标准::未来<void>到非标量标准::未来<bool>引发的错误转换
- 计算标准::矢量<bool>中的设定值
- 获取非专用标准::矢量容器的标准方法<bool>
- 标准::列表<bool>的实施
- 是否有一种替换C风格的Bool数组的标准方法
- C++:标准::原子<bool>和挥发性布尔值
- 在标准::位集和标准::矢量<bool>之间转换
- 否定标准::integral_constant<bool>
- 快速标准::矢量<bool>复位