1

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

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

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

有任何想法吗 ?

4

2 回答 2

0

我想说这不仅仅是内存消耗的问题,还有一致性的问题。取决于您将如何对原始输入数据使用各种视图。一般来说,我建议使用std::unique_ptr原始数据和std::weak_ptr视图参考。

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

对于后一种情况,具有一种FlyWeight模式实现可能更合适。

于 2013-07-31T19:28:17.703 回答
0

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

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

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

  • 您是否需要原始向量的内存布局保持不变,或者您可以容纳某种派生类型的向量?
  • 你的矢量内容会改变吗?它可以成长吗?
  • 无论如何,其中的元素会按时间顺序(插入和保留)吗?
  • 除了向量位置之外,您还需要通过插入时间查找向量元素吗?
于 2013-07-31T19:46:08.503 回答