用整数值更新dynamic_bitset

问题描述 投票:0回答: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更新值的任何想法?

c++ boost bitset boost-dynamic-bitset
1个回答
0
投票

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

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

但是,由于似乎断言该位集在初始化之前是清楚的,因此使用具有相同效果的append()会更自然(并且最终需要8位以上时可能会有更多好处):

Live On Coliru

#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)以限制容量

© www.soinside.com 2019 - 2024. All rights reserved.