Basic - shared_ptr到值向量的向量

时间:2013-03-29 18:32:25

标签: c++ pointers vector c++11 shared-ptr

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

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

我正在使用一个包含很多shared_ptr的库,这就是我将要使用的内容。

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

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

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

2 个答案:

答案 0 :(得分:2)

要在堆上存储内容,请在c ++中使用new或在c中使用malloc。虽然我相信矢量实现确实使用堆,因为vector是一个动态大小的容器。所以实际上如果你向一个向量添加一个元素,elemenet已经在堆上了,除非它是一个指针,在这种情况下只有指针在堆上而不是指针所指向的元素@Oswald指出。

答案 1 :(得分:2)

  

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

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

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

关于存储来自何处的问题,std::vector 总是在连续的存储区域中动态分配其元素,无论这些是shared_ptr s ,vectorData

但是,我建议你考虑一下你是否真的需要引用语义,或者它是否足以在容器中按值存储Data类型的对象:

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

这将简化您的代码,您还可以摆脱shared_ptr内存和运行时开销。

无论您是否需要引用语义,只有您作为应用程序的设计者才能分辨。您提供的信息不足以让我毫无疑问地告诉它,但希望这个答案能给您一些暗示您应该问自己的问题,以及每种情况下的答案是什么。