使用整数值更新dynamic_bitset

Update dynamic_bitset with integer value

本文关键字:dynamic bitset 更新 整数      更新时间:2023-10-16

使用dynamic_bitset可以基于整数值进行初始化(下面的5,124(。 是否也可以使用整数值进行更新?

下面的解决方案在创建新dynamic_bitset时在每次更新时分配堆内存。 这是一个糟糕的解决方案(缓慢,可能的堆碎片等(。

std::vector<boost::dynamic_bitset<uint8_t>> data;
data.push_back(boost::dynamic_bitset<uint8_t>(4, 5));
data.push_back(boost::dynamic_bitset<uint8_t>(7, 124));
for(const auto& s: data)
std::cout << s << std::endl; 
for(int i; i<10; i++)
{
data[0]=boost::dynamic_bitset<uint8_t>(4, i);
for(const auto& s: data)
std::cout << s << std::endl; 
}

关于如何在不设置每个位的情况下从 int 更新值的任何想法?

也许您可以从阻止列表中初始化:

for(uint8_t i = 0; i<10; i++) {
data[0].clear();
data[0].init_from_block_range(&i, &i+1);
}

但是,由于它似乎断言位集在 init 之前是明确的,因此使用具有相同效果的append()会感觉更自然(当您最终需要 8 位时可能会有更多好处>(:

住在科里鲁

#include <boost/dynamic_bitset.hpp>
#include <iostream>
using BSet = boost::dynamic_bitset<uint8_t>;
using Block = BSet::block_type;
int main() {
std::vector<BSet> data;
data.emplace_back(4, 5);
data.emplace_back(7, 124);
auto& a = data[0];
auto& b = data[1];
std::cout << a << "t" << b << "n----n";
for(Block i = 0; i<10; i++)
{
a.clear();
a.init_from_block_range(&i, &i+1);
b.clear();
b.append(i);
std::cout << a << "t" << b << "n";
}
}

指纹

0101    1111100
----
00000000    00000000
00000001    00000001
00000010    00000010
00000011    00000011
00000100    00000100
00000101    00000101
00000110    00000110
00000111    00000111
00001000    00001000
00001001    00001001

注意添加.resize(4)以限制容量

我不确定这个函数是否应该是公共接口的一部分(看起来可能不是(,但你显然可以使用

c.clear();
c.dispatch_init(4, i, {});

在科里鲁也看到它