我可以从 uint8_t(或 std::byte)范围初始化 std::vector<bool> 以便输入中的每一位都被视为布尔值吗?

NoS*_*tAl 7 c++ stdvector

我知道这std::vector<bool>很糟糕,但我有一个非常好的用例。

我想做这样的事情:

uint8_t data [] = {7,32};
std::vector<bool> vb/*...*/ ;
// now vb is size of 8 vector with this values:
//   false, false, false, false, false, true,  true,  true, (7)
//   false, false, true, false, false,  false, false, false (32)
Run Code Online (Sandbox Code Playgroud)

注意:我知道我可以手动解析输入的每个字节并进行 8 次插入,但我正在寻找标准中预先构建的内容

And*_*dyG 6

std::vector<bool>在这里是一个糟糕的选择,因为您正在考虑它的实现而不是它的行为......只是避免vector<bool>.

使用 aboost::dynamic_bitset代替。有趣的是,我个人发现无论如何它的性能要高得多:

std::array<std::uint8_t, 2> data {7,32};
boost::dynamic_bitset<std::uint8_t> vb(rbegin(data), rend(data));
std::cout << vb; // 0000011100100000
Run Code Online (Sandbox Code Playgroud)

现场演示

我们必须反转输入范围,因为 boost 的动态位集附加到最高有效位的末尾(通常是左侧),而不是右侧。