Я создаю программу, которая сжимает файлы со сжатием Хаффмана. Первоначально я использовал вектор uint8_t для хранения байтов из файла, но производительность была ужасной (2 часа, чтобы распаковать файл размером 74 МБ).
Я решил использовать 16-битные порции для представления значений из файла.
Первоначально у меня было это (входной битовый набор имеет 520 миллионов битов в нем)
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 из динамического набора битов таким образом?
Проблема здесь может быть не в том, что вы думаете.
В вашем байтовом подходе добавление 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));
Проблема с простой вставкой в конец вектора состоит в том, что вектор будет копироваться несколько раз, пока он растет. Вы можете избежать этого, выделив достаточно памяти для работы.
Других решений пока нет …