如何节省空间地在文件中存储和检索std :: vector <int>值

时间:2019-06-07 15:06:12

标签: c++ std stdvector

我有一个std::vector<int>,该值由-1,0,1组成。在对这些值进行一些初始操作后,我得到一个可以省略-1值的向量。 如何有效地将所需的0,1值存储在文件中(空间(更重要)和时间)。

似乎有3个推荐的选项std::vector<bool>std::bitsetboost::dynamic_bitset,但在这种情况下最好。 我可以遍历向量并将if value!=-1添加到vector<bool>然后存储它,但这是最好的方法吗?该向量有大约一百万个元素(经过处理)。

// 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

编辑: 有关此问题的更多背景细节。空间效率是必须的,因为我要存储邻接矩阵的压缩格式(执行一些自定义压缩)。每个节点最多可具有一百万个边缘(有时甚至更多),并且大约有一千万个这样的节点(处理大型图)。目的是在内存中完全加载该图的压缩形式,并支持基本查询,而无需解压缩并支持流边缘(例如,实时日志图具有4,847,571个节点)。

1 个答案:

答案 0 :(得分:3)

如果空间效率是一个大问题,而您只有0和1,那么您可以考虑存储二进制字符串的行程编码。

请参见https://en.wikipedia.org/wiki/Run-length_encoding

最糟糕的情况是您交替使用0和1。

代码应该相对简单,涉及单个传递向量。