-1

我有一个只包含几个整数的对象向量的向量。

外部向量包含数百个向量,这些向量包含数千到数十万个数据对象。

我正在使用一个涉及很多 shared_ptr 的库,所以这就是我将要使用的。

如何存储它以便将数据存储到堆中?

std::vector<std::shared_ptr<std::vector<Data>>>
std::vector<std::vector<std::shared_ptr<Data>>>

ETC

处理这个问题的正确方法是什么?

4

2 回答 2

2

new将某些内容存储在您在 c++ 或c 中使用的堆上malloc。尽管我相信向量实现确实使用了堆,因为向量是一个动态大小的容器。因此,实际上,如果您将元素添加到 elemenet 已经在堆上的向量,除非它是一个指针,在这种情况下,只有指针在堆上,而不是指针指向的元素,正如 @Oswald 指出的那样。

于 2013-03-29T18:35:32.627 回答
2

如何存储它以便将数据存储到堆中?

如果您需要引用语义,即如果您需要容器中的值作为值的别名,这些值也从代码的其他部分引用,并且在代码的一部分中所做的修改应该对其他部分可见修改Data对象的别名,我会说这是正确的容器定义:

std::vector<std::vector<std::shared_ptr<Data>>>

对于您关于存储来自何处的问题,std::vector 始终在连续的存储区域中动态分配其元素,无论它们是shared_ptrs、vectors 还是Datas。

但是,我建议您考虑是否真的需要引用语义,或者Data在容器内按值存储类型的对象是否不够:

std::vector<std::vector<Data>>

This would simplify your code and you would also get rid of the shared_ptr memory and run-time overhead.

Whether or not you need reference semantics is something that only you, as the designer of your application, can tell. The information you provided is not enough for me to tell it without uncertainty, but hopefully this answer gave you a hint on the kind questions you should ask yourself, and what would be the answer in each case.

于 2013-03-29T18:43:40.723 回答