2014-12-05 24 views
1

我正在开发一组所有派生自抽象向量的向量类。我这样做是为了在使用这些向量的软件中,我们可以在没有任何代码中断的情况下快速切换向量(或至少将故障最小化,但我的目标是完全兼容)。所有的矢量匹配。C++ - 管理基于磁盘的向量中的引用

我的工作在基于磁盘的向量中大多符合匹配STL向量执行。我这样做是因为我们需要处理包含各种格式数据的大量内存不足的文件。磁盘矢量通过使用模板专业化/多态性的序列化和反序列化类来处理数据读/写到磁盘。数据序列化和反序列化已经过测试,并且工作正常(到目前为止)。处理数据引用时出现问题。

例如,

给定一个DiskVector dv,以dv[10]的调用将得到一个指向磁盘上的一个点,然后寻求在那里,读出的字符流。这个流被传递给反序列化器,该反序列器将字节流转换为适当的数据类型。一旦我有了价值,我就会回报它。

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

如果这种情况持续下去,不清洗的话,由于所有的数据只是被加载到内存中,这是不好的,由于数据量的DiskVector的目的丢失。所以我通过在其他呼叫进行时删除索引来清理此地图。不幸的是,如果用户决定长时间存储此参考文件,然后在DiskVector中将其删除,则会出现问题。

所以我的问题

  • 有没有办法,看看是否在一定情况下的任何其他参考文献都在使用?
  • 有没有更好的方法来解决这个问题,同时仍然保持多态的风格,因为开始描述的原因?
  • 是否有可能构造一个特殊的类作为参考,但动态处理磁盘IO,所以我可以只返回它呢?
  • 有没有其他想法?
+4

而不是返回引用,你可以返回一个具有'运算符T()'和'运算符=(T const&)'的对象。这意味着你可以主要使用这个对象,就像它是数据的一个实例一样。你可以用一个偏移量构造这个对象到文件中,所以'operator T()'是从磁盘读取数据的代理,'operator =(T const&)'是写数据的代理磁盘。 – cdhowie 2014-12-05 16:16:55

+2

是的,已有先例在[了'矢量'专业化]返回,而不是实际的C包装对象++参考(http://en.cppreference.com/w/cpp/container/vector_bool/reference)。 – cdhowie 2014-12-05 16:22:13

+0

太棒了。谢谢。我会让它工作并发布解决方案的详细信息。 – 2014-12-05 18:33:27

回答

0

因此,我试图做的更好的解决方案是使用SQLite作为数据库的后端。使用BLOB作为键和值列的列类型。这是我现在采取的方法。也就是说,为了使它运行良好,我需要使用cdhowie发布在我的问题的评论中。