我正在创建一个使用霍夫曼压缩程序压缩文件的程序。最初,我使用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向量?
答案 0 :(得分:1)
这里的问题可能不是您的想法。
在您基于字节的方法中,添加一个reserve
调用可能会大大改善您的情况。
std::vector<uint8_t> bytes;
boost::dynamic_bitset<unsigned char> input;
bytes.reserve(input.num_blocks());
boost::to_block_range(input, std::back_inserter(bytes));
仅在向量的后面插入的问题是向量在增长时将被复制多次。您可以通过为其提供足够的内存来避免这种情况。