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

标签 c++ std stdvector

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

似乎有3个推荐选项std::vector<bool> , std::bitsetboost::dynamic_bitset但在这种情况下哪个是最好的。 我可以循环遍历 vector 和 if value!=-1将其添加到 vector<bool>然后存储它,但这是最好的方法吗?该 vector 有大约 100 万个元素(操作后)。

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

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

最佳答案

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

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

最坏的情况是 0 和 1 交替出现。

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

关于c++ - 如何在文件中节省空间地存储和检索 std::vector<int> 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56496915/

相关文章:

c++ - 为什么STL要为Allocator预留接口(interface)?

c++ - std::vector 的奇怪行为

algorithm - "cut and paste"std::vector 的最后 k 个元素有效吗?

c++ - 给定一个填充 unsigned char** 的 C 函数,如何在没有中间拷贝的情况下用数据填充 std::vector

matlab - MATLAB 中的统计异常值检测

c++ - 如何从返回 vector 的函数中获取 vector 值?

c++ - Pimpl 习语和没有友元声明的内部对象协作

python 和 ctypes 访问具有嵌套结构的 C++ 类

android - 如何从 react-native 代码调用 C 函数?

android - 标准C++库的跨平台程度如何?