У меня есть std::vector<int>
, который состоит из значений -1,0,1. После некоторых первоначальных манипуляций с этими значениями я получаю вектор, в котором значения -1 можно опустить.
Как эффективно хранить необходимые 0,1 значения в файле как в пространстве (более важно), так и во времени.
Кажется, есть 3 рекомендуемых варианта std::vector<bool>
, std::bitset
и boost::dynamic_bitset
, но которые будут лучшими в этом случае.
Я могу перебрать вектор и if value!=-1
добавить его в vector<bool>
и затем сохранить его, но это лучший способ? Вектор содержит около 1 миллиона элементов (после манипуляции).
// Initialize temp_array of size n(obtained in runtime) with value -1
std::vector<int> temp_array(n, -1);
// Do some manipulation on the temp array
// Now temp array has values containing -1,0,1 of which all occurrences of -1 can be removed without worrying about the index
std::vector<bool>final_array;
for (const auto &i : temp_array)
{
if (i != -1)
{
final_array.push_back(i);
}
}
// How to store and retrieve this in the most space efficient way
Edit:
Еще несколько подробностей о проблеме. Эффективность пространства является обязательным, потому что я храню сжатый формат матрицы смежности (выполняя некоторое пользовательское сжатие). Каждый узел может иметь до миллиона ребер (иногда даже больше), и таких узлов насчитывается около 10 миллионов (при работе с большими графами). Цель состоит в том, чтобы загрузить сжатую форму этого графа полностью в память и поддерживать базовые запросы без необходимости распаковывать и поддерживать край потоковой передачи (например, график живого журнала имеет 4847571 узел).