Заполните вектор uint16_t, используя boost :: dynamic_bitset & lt; & gt;

Я создаю программу, которая сжимает файлы со сжатием Хаффмана. Первоначально я использовал вектор 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 из динамического набора битов таким образом?

0

Решение

Проблема здесь может быть не в том, что вы думаете.

В вашем байтовом подходе добавление 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));

Проблема с простой вставкой в ​​конец вектора состоит в том, что вектор будет копироваться несколько раз, пока он растет. Вы можете избежать этого, выделив достаточно памяти для работы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector