我有一个包含几个整数的对象向量的向量。
外部向量包含数百个向量,这些向量包含数千到数十万个数据对象。
我正在使用一个包含很多shared_ptr的库,这就是我将要使用的内容。
如何存储它以便将数据存储到堆中?
std::vector<std::shared_ptr<std::vector<Data>>>
std::vector<std::vector<std::shared_ptr<Data>>>
等
处理此问题的正确方法是什么?
答案 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 ,vector
或Data
。
但是,我建议你考虑一下你是否真的需要引用语义,或者它是否足以在容器中按值存储Data
类型的对象:
std::vector<std::vector<Data>>
这将简化您的代码,您还可以摆脱shared_ptr
内存和运行时开销。
无论您是否需要引用语义,只有您作为应用程序的设计者才能分辨。您提供的信息不足以让我毫无疑问地告诉它,但希望这个答案能给您一些暗示您应该问自己的问题,以及每种情况下的答案是什么。