微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针向量 vs 对象向量 vs 堆上的向量

如何解决指针向量 vs 对象向量 vs 堆上的向量

以下例子的用例是什么:-


vector<Object> collection;

vector<Object> *collection = new vector<Object>

vector<Object*> collection;(creating the object on the heap)

我什么时候需要在对象向量上创建指针向量,并且向量(或任何 STL 容器)不分配堆上的元素?

解决方法

通常,

std::vector<Object> collection; // Always use this if possible

您应该始终将对象直接存储为 std::vector 中的值。 vector 将其内容动态存储在堆上。

这个,

std::vector<Object>* collection = new vector<Object>; // NEVER use this

我想不出任何有用的理由。 vector 已经将其元素动态存储在堆上,如果需要,您可以使用 std::movestd::swap 廉价且轻松地移动整个内容。

您可能需要做的是让多个组件来管理您的向量的生命周期。在那种情况下,std::shared_ptr 可能是合适的:

auto collection = std::make_shared<std::vector<Object>>(); // possible

在各种情况下可能需要最后一个。例如,您可能需要使用不同标准排序的另一个向量的单独“视图”:

std::vector<Object> collection; 
std::vector<Object*> collection_view; // avoid

然而,这可能很危险,因为指针很容易失效,尤其是在指向另一个 vector 的元素时。如果您需要这样的东西,请尝试将所有数据封装在一个类中。

更可能的需求是,如果您想以多态的方式访问vector的元素。在这种情况下,vector 将负责删除对象,并应使用 std::unique_ptr 来确保正确删除它们:

std::vector<std::unique_ptr<Object>> collection; // Polymorphism?

多态需要通过指针或引用访问对象。

可能还有其他可能性,您无法一概而论。但这些都是常见的经验法则。

,

你几乎从不想要:

vector<Object> *collection = new vector<Object>

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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。