指针向量 vs 对象向量 vs 堆上向量
Vector of pointers vs Vector of objects vs Vector on the heap
以下示例的用例是什么:-
vector<Object> collection;
vector<Object> *collection = new vector<Object>
vector<Object*> collection;(creating the object on the heap)
我什么时候需要在对象向量上创建指针向量,并且该向量(或任何 STL 容器)不会在堆上分配元素?
你几乎从不想要:
vector<Object> *collection = new vector<Object>
A std::vector
确实将其元素存储在堆上。动态创建向量本身并没有增加明显的好处,反而带来了麻烦。
只有在极少数情况下,原始指针向量才是您所需要的。
vector<Object*> collection;(creating the object on the heap)
当您需要指针而不需要指针时,您确实需要指针向量。例如,当 Object
是多态类型时。不过你会在向量中存储智能指针,而不是原始指针。
std::vector< std::shared_ptr<Object> > collection; // shared ownership
std::vector< std::unique_ptr<Object> > colleciton; // the vector is the only owner
仅当向量中的指针不参与实际 Object
的所有权时,您可能需要原始指针向量。 (简单来说:所有权 = 谁负责管理 Object
的生命周期)。
适合所有情况的大约 99% 的 goto 解决方案是
vector<Object> collection;
通常,
std::vector<Object> collection; // Always use this if possible
您应该始终将对象直接存储为 std::vector
中的值。 vector 将其内容动态存储在堆上。
这个,
std::vector<Object>* collection = new vector<Object>; // NEVER use this
我想不出任何有用的理由。 vector 已经将其元素动态存储在堆上,如果需要,您可以使用 std::move
或 std::swap
廉价且轻松地移动整个内容。
您可能需要做的是让几个组件管理您的向量的生命周期。在 的情况下,std::shared_ptr
可能是合适的:
auto collection = std::make_shared<std::vector<Object>>(); // possible
在各种情况下可能需要最后一个。例如,您可能需要使用不同标准 sorted 的另一个向量的单独“视图”:
std::vector<Object> collection;
std::vector<Object*> collection_view; // avoid
但是,这可能很危险,因为指针很容易失效,尤其是在指向另一个 vector 的元素时。如果您需要这样的东西,请尝试 封装 所有数据在一个 class.
中
如果您想以多态方式向量 访问 的元素,则更有可能需要。在这种情况下,vector 将负责删除对象并且应该使用 std::unique_ptr
来确保它们被正确删除:
std::vector<std::unique_ptr<Object>> collection; // Polymorphism?
多态性需要通过指针或引用访问对象。
可能还有其他的可能性,不能一概而论。但这些都是常见的经验法则。
以下示例的用例是什么:-
vector<Object> collection;
vector<Object> *collection = new vector<Object>
vector<Object*> collection;(creating the object on the heap)
我什么时候需要在对象向量上创建指针向量,并且该向量(或任何 STL 容器)不会在堆上分配元素?
你几乎从不想要:
vector<Object> *collection = new vector<Object>
A std::vector
确实将其元素存储在堆上。动态创建向量本身并没有增加明显的好处,反而带来了麻烦。
只有在极少数情况下,原始指针向量才是您所需要的。
vector<Object*> collection;(creating the object on the heap)
当您需要指针而不需要指针时,您确实需要指针向量。例如,当 Object
是多态类型时。不过你会在向量中存储智能指针,而不是原始指针。
std::vector< std::shared_ptr<Object> > collection; // shared ownership
std::vector< std::unique_ptr<Object> > colleciton; // the vector is the only owner
仅当向量中的指针不参与实际 Object
的所有权时,您可能需要原始指针向量。 (简单来说:所有权 = 谁负责管理 Object
的生命周期)。
适合所有情况的大约 99% 的 goto 解决方案是
vector<Object> collection;
通常,
std::vector<Object> collection; // Always use this if possible
您应该始终将对象直接存储为 std::vector
中的值。 vector 将其内容动态存储在堆上。
这个,
std::vector<Object>* collection = new vector<Object>; // NEVER use this
我想不出任何有用的理由。 vector 已经将其元素动态存储在堆上,如果需要,您可以使用 std::move
或 std::swap
廉价且轻松地移动整个内容。
您可能需要做的是让几个组件管理您的向量的生命周期。在 的情况下,std::shared_ptr
可能是合适的:
auto collection = std::make_shared<std::vector<Object>>(); // possible
在各种情况下可能需要最后一个。例如,您可能需要使用不同标准 sorted 的另一个向量的单独“视图”:
std::vector<Object> collection;
std::vector<Object*> collection_view; // avoid
但是,这可能很危险,因为指针很容易失效,尤其是在指向另一个 vector 的元素时。如果您需要这样的东西,请尝试 封装 所有数据在一个 class.
中如果您想以多态方式向量 访问 的元素,则更有可能需要。在这种情况下,vector 将负责删除对象并且应该使用 std::unique_ptr
来确保它们被正确删除:
std::vector<std::unique_ptr<Object>> collection; // Polymorphism?
多态性需要通过指针或引用访问对象。
可能还有其他的可能性,不能一概而论。但这些都是常见的经验法则。