вектор — C ++ Сохранение динамического набора в файл

Вроде продолжения до Как сохранить вектор<BOOL> или битовый файл, но битовый?

В основном я пишу набор битов в виде двоичного файла со следующим кодом:

boost::dynamic_bitset<boost::dynamic_bitset<>::block_type> filter;
vector<boost::dynamic_bitset<>::block_type> filterBlocks(filter.num_blocks());

//populate vector blocks
boost::to_block_range(filter, filterBlocks.begin());

ofstream myFile(filterFilePath.c_str(), ios::out | ios::binary);

//write out each block
for (vector<boost::dynamic_bitset<>::block_type>::iterator it =
filterBlocks.begin(); it != filterBlocks.end(); ++it)
{
//retrieves block and converts it to a char*
myFile.write(reinterpret_cast<char*>(&*it),
sizeof(boost::dynamic_bitset<>::block_type));
}
myFile.close();

Я использовал метод динамического набора битов и to_block_range во временный вектор, затем распечатывал блоки в файл. Это работает, но я удваиваю свое использование памяти, когда я использую промежуточный вектор (используемый вектор — тот же самый размер моего набора битов). Как я могу распечатать набор битов в файл, не удваивая использование моей памяти?

Было бы неплохо, если бы я мог перебирать наборы битов в блоках, но, похоже, чтобы предотвратить некоторые другие проблемы, авторы динамического набора битов намеренно пропустили такую ​​функциональность. Должен ли я использовать другую структуру данных? Если это помогает для контекста, я использую набор битов в некотором коде фильтра Блума.

4

Решение

Вы должны сделать это вручную. Перебирайте биты, упаковывайте их в unsigned charс и stream.put символы в файл.

Напрямую пишу родную block_type приводит к тому, что формат файла зависит от порядка следования платформ, что обычно нежелательно. (И настройка block_type в char повредит производительности.)

Глядя на ваш другой вопрос, я вижу, что это то же самое, что предложил Наваз, и что вы можете вернуться к использованию std::vector<bool> вместо.

1

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

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

По вопросам рекламы [email protected]