Заполните вектор uint16_t, используя boost :: dynamic_bitset <> - PullRequest
0 голосов
/ 03 декабря 2018

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

1 Ответ

0 голосов
/ 03 декабря 2018

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

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

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

...