在 std::bitset 和 std::vector<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()
将bitset转换为[=13=的字符串] 和 '0'
。从 C++11 开始,您实际上可以选择与这两个字符不同的字符,因此您实际上可以选择 '[=15=]'
和 ''
.
您确定 bitset
是您任务的最佳类型吗?
Matthew Austern 在这里为 bitset
写了一个迭代器:http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2
超过100行,我觉得只是把它举起来放在这个答案中可能有点越界。但它对 STL 算法非常有效。
Austern 回答了这个确切的问题:
While bitset doesn’t have the STL container interface, it’s still a perfectly good (fixed-size) container. If it makes sense for you to use a bitset, and if you also need iterators, then you can define a simple “index iterator” adaptor that translates iterator notation like *i into array notation like b[n]. The implementation is straightforward: maintain an index and a pointer to a container.
他确实警告他的迭代器:
If we were willing to accept a slightly more cumbersome interface, we could define a class that worked with arbitrary array-like types. A general purpose index iterator adaptor is often useful when dealing with pre-STL container classes, and sometimes even when dealing with STL containers like vector.
还应注意,与 vector<bool>::iterator
一样,Austern 的 bitset_iterator::operator*
不是 return bool&
而是代理参考:bitset<>::reference
.
bitset_iterator
的用法如下所示:
std::bitset<10> foo;
std::vector<bool> bar(begin(foo), end(foo));
我有一个 std::bitset
但现在我想在上面使用 STL 算法。
我本可以使用 std::vector<bool>
,但我喜欢 std::bitset
的构造函数,我想要 std::bitset
的按位运算。
我是否必须通过一个循环将所有内容都塞入 std::vector<bool>
才能使用 STL 算法,然后将其复制回 std::bitset
,还是有更好的方法?
如果你不想使用bitset
的operator[]
写循环,那么你可以尝试使用bitset::to_string()
将bitset转换为[=13=的字符串] 和 '0'
。从 C++11 开始,您实际上可以选择与这两个字符不同的字符,因此您实际上可以选择 '[=15=]'
和 ''
.
您确定 bitset
是您任务的最佳类型吗?
Matthew Austern 在这里为 bitset
写了一个迭代器:http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2
超过100行,我觉得只是把它举起来放在这个答案中可能有点越界。但它对 STL 算法非常有效。
Austern 回答了这个确切的问题:
While bitset doesn’t have the STL container interface, it’s still a perfectly good (fixed-size) container. If it makes sense for you to use a bitset, and if you also need iterators, then you can define a simple “index iterator” adaptor that translates iterator notation like *i into array notation like b[n]. The implementation is straightforward: maintain an index and a pointer to a container.
他确实警告他的迭代器:
If we were willing to accept a slightly more cumbersome interface, we could define a class that worked with arbitrary array-like types. A general purpose index iterator adaptor is often useful when dealing with pre-STL container classes, and sometimes even when dealing with STL containers like vector.
还应注意,与 vector<bool>::iterator
一样,Austern 的 bitset_iterator::operator*
不是 return bool&
而是代理参考:bitset<>::reference
.
bitset_iterator
的用法如下所示:
std::bitset<10> foo;
std::vector<bool> bar(begin(foo), end(foo));