在多个容器中包含单个数据

Containing single data in multiple containers

本文关键字:包含单 数据      更新时间:2023-10-16

我有很多数据要获取和处理(接近一百万),我不想在整个程序中复制或移动它。

让我举个例子来描述一下情况。我有一个包含100.000个元素的Vector。我想记录这些元素插入向量的时间。因此,将时间和数据都保存在Map中是个好主意。但是,我仍然想使用矢量。是否有任何方法可以实现Map的第二个元素显示Vector,但不会不必要地浪费任何资源?

我想到的第一件事是在Vector中包含数据地址。然而,指针使用4个字节(不确定),例如,如果我们想包含char的地址,它比数据本身大4倍。

有什么想法吗?

我认为这不仅仅是内存消耗的问题,也是一致性的问题。这取决于您将如何对原始输入数据使用各种视图。通常,我建议使用std::unique_ptr作为原始数据,使用std::weak_ptr作为视图中的参考。

但您是对的,可能会有一定的内存使用开销,因为指针大小超过了指针对象的大小。

对于后一种情况,采用一种FlyWeight模式可能更合适。

在多个容器中包含单个数据

是的,您可以使用Boost多索引容器库以多种方式对相同的数据进行索引,而不会重复内容。与自制的XXX_ptr解决方案不同,多索引容器还负责保持所有内容的一致性(从容器中删除数据单元会自动将其从所有索引中删除)

根据您的应用程序的要求、特殊性和数据插入/生命周期模式,重量更轻、更专业的解决方案(可能比muklti索引容器和/或自制XXX_ptr解决方案更高效)也是可能的:

  • 你需要原始向量的内存布局保持不变,还是可以容纳某种派生类型的向量
  • 你的矢量内容会改变吗?它能生长吗
  • 其中的元素会按时间顺序插入和保留吗
  • 除了矢量位置外,还需要按插入时间查找矢量元素吗