Вроде продолжения до Как сохранить вектор<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 во временный вектор, затем распечатывал блоки в файл. Это работает, но я удваиваю свое использование памяти, когда я использую промежуточный вектор (используемый вектор — тот же самый размер моего набора битов). Как я могу распечатать набор битов в файл, не удваивая использование моей памяти?
Было бы неплохо, если бы я мог перебирать наборы битов в блоках, но, похоже, чтобы предотвратить некоторые другие проблемы, авторы динамического набора битов намеренно пропустили такую функциональность. Должен ли я использовать другую структуру данных? Если это помогает для контекста, я использую набор битов в некотором коде фильтра Блума.
Вы должны сделать это вручную. Перебирайте биты, упаковывайте их в unsigned char
с и stream.put
символы в файл.
Напрямую пишу родную block_type
приводит к тому, что формат файла зависит от порядка следования платформ, что обычно нежелательно. (И настройка block_type
в char
повредит производительности.)
Глядя на ваш другой вопрос, я вижу, что это то же самое, что предложил Наваз, и что вы можете вернуться к использованию std::vector<bool>
вместо.
Других решений пока нет …