我正在创建一个使用 Huffman 压缩来压缩文件的程序。最初我使用 uint8_t 的向量来存储文件中的字节,但性能很糟糕(解压缩 74 MB 文件需要 2 小时)。我决定使用 16 位块来表示文件中的值。
最初,我有这个(输入位集有 5.2 亿位)
std::vector<uint8_t> bytes;
boost::dynamic_bitset<unsigned char> input;
boost::to_block_range(input, std::back_inserter(bytes));
这很好用,它填充了一个充满 8 位整数的向量,代表文件的每个字节。每个位的频率都记录在一个大小为 256 的整数向量中。这运行得非常糟糕。解码一个字符串绝对需要永远,因为我的文件中这些整数的频率是巨大的。我认为如果我使用 16 位整数并将频率存储在大小为 65536 的向量中会更好。这是我尝试填充“字节”向量的尝试:
std::vector<uint16_t> bytes;
boost::dynamic_bitset<unsigned char> input;
boost::to_block_range(input, std::back_inserter(bytes));
这里的问题是 to_block_range() 函数从我的位集中取出 8 位并用 8 个零填充它们,而不是一次取出 16 个字节。
有没有办法以这种方式从动态位集中填充 uint16_t 向量?