C++ - 在基于磁盘的 vector 中管理引用

标签 c++ vector reference polymorphism disk-io

我正在开发一组全部派生自抽象 vector 的 vector 类。我这样做是为了在我们使用这些 vector 的软件中,我们可以在不破坏任何代码的情况下在 vector 之间快速切换(或者至少最大限度地减少故障,但我的目标是完全兼容)。所有 vector 都匹配。

我正在研究一个基于磁盘的 vector ,它主要符合匹配 STL vector 实现的要求。我这样做是因为我们需要处理包含各种数据格式的大量内存不足文件。 Disk Vector 通过使用序列化和反序列化类的模板特化/多态性来处理数据读/写到磁盘。数据序列化和反序列化已经过测试,并且有效(到目前为止)。我的问题发生在处理对数据的引用时。

例如,

给定一个 DiskVector dv,对 dv[10] 的调用将指向磁盘上的一个点,然后在那里寻找,读出字符流。该流被传递给反序列化器,反序列化器将字节流转换为适当的数据类型。一旦我获得了值(value),我就会归还它。

这是我遇到的问题。在STL中,他们将其作为引用返回,所以为了匹配他们的风格,我需要返回一个引用。我所做的是将值存储在具有给定索引(在本例中为 10)的 unordered_map 中。然后我返回对 unordered_map 中值的引用。

如果这在没有清理的情况下继续进行,那么 DiskVector 的目的就失去了,因为所有数据都只是加载到内存中,这由于数据大小而很糟糕。因此,我稍后在进行其他调用时通过删除索引来清理此映射。不幸的是,如果用户决定长期存储此引用,然后它在 DiskVector 中被删除,我们就会遇到问题。

所以我的问题

  • 有没有办法查看是否正在使用对特定实例的任何其他引用?
  • 有没有更好的方法来解决这个问题,同时由于开头所述的原因仍然保持多态样式?
  • 是否可以构建一个特殊的类作为引用,但动态处理磁盘 IO,这样我就可以返回它?
  • 还有其他想法吗?

最佳答案

所以我尝试做的更好的解决方案是使用 SQLite 作为数据库的后端。使用 BLOB 作为键和值列的列类型。这就是我现在采取的方法。也就是说,为了让它正常工作,我需要使用 cdhowie 在我的问题的评论中发布的内容。

关于C++ - 在基于磁盘的 vector 中管理引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320100/

相关文章:

java - Java 中的实例到底是什么?

c++ - 旋转二维整数数组

c++ - 构造函数中的数组

c++ - 使用 Qt MultiMedia 和 Widgets 播放网络流媒体视频

c++ - 删除特定索引处的 vector 元素

java - JAVA vector 排序

c++ - boost::ptr_vector 和指针

reference - Julia 函数引用参数

c++ - Windows 嵌入式标准不是有效的 win32 c++

sql - 节点集上的 XPath 查询像 SQL 一样工作