1

使用 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 更新值的任何想法?

4

1 回答 1

0

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

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, {});

也可以在 Coliru上看到它

于 2020-05-18T17:39:48.163 回答