将对象或指针存储在矢量中

时间:2012-06-20 14:33:40

标签: c++ oop

我在这里问了一个非常相似的问题,但由于这是一个基本问题,我想更准确地陈述我的(新)问题。

假设我有一个非常复杂的A类,A的每个实例都存储在多个容器中,例如向量,队列等......

即使在静态设置中,也意味着对象被添加到容器一次并且不会被删除或修改:
容器现在是否包含指向对象或对象本身的指针?

3 个答案:

答案 0 :(得分:8)

如果您需要对象的副本 - 请使用对象。如果需要共享对象或需要多态行为 - 请使用smart pointers的容器。在使用智能指针的情况下,您将同时具有自动对象销毁和多态行为。

例如:

std::vector<std::shared_ptr<MyObject>> v;
auto ptr = std::shared_ptr<MyObject>(new MyObject());
v.push_back(ptr);

如果您需要存储唯一指针(不共享):

std::vector<std::unique_ptr<MyObject>> v;
auto ptr = std::unique_ptr<MyObject>(new MyObject());
v.push_back(std::move(ptr));

答案 1 :(得分:3)

如果A的每个实例都存储在多个容器中,那么必须存储(智能)指针而不是对象本身。否则每个容器都有自己唯一的副本。修改一个容器中的实例不会影响其他容器。即使您没有修改任何内容,存储完整的对象副本也不会说出您的意思,即容器中的实例实际上是相同的。

答案 2 :(得分:2)

如果您的对象很大,或者复制成本高或复制起来很复杂,那么请存储智能指针。