一个std ::指针向量?

时间:2010-09-05 03:37:36

标签: c++ vector

这是我正在尝试做的事情。我有一个具有一定数量元素的std :: vector,它可以增长但不会缩小。问题在于它的基础类型,所以在那个位置可能没有任何东西。而不是创建一个空对象和浪费内存,我想到的只是在std::vector中对该单元格进行NULL操作。问题是如何在不需要管理内存的情况下获取指针?我怎样才能利用不必做新的事情并跟踪指针?

5 个答案:

答案 0 :(得分:4)

对象有多大,你预期向量的稀疏程度如何?如果对象不大或孔数不多,那么拥有一些“空”对象的成本可能低于必须动态分配对象和管理指针的成本。

也就是说,如果你想在向量中存储指针,你将需要使用智能指针向量(例如,vector<shared_ptr<T>>)或设计用于拥有指针的容器(例如,Boost的{ {1}})。

答案 1 :(得分:0)

如果您要使用指针,则需要管理内存。

听起来对你来说最好的解决方案就是使用boost :: optional。我相信它正是你正在寻找的语义。 (http://www.boost.org/doc/libs/1_39_0/libs/optional/doc/html/index.html)。

实际上,在我写完之后,我意识到你的用例(例如昂贵的默认构造函数)被boost :: optional docs使用:http://www.boost.org/doc/libs/1_39_0/libs/optional/doc/html/boost_optional/examples.html#boost_optional.examples.bypassing_expensive_unnecessary_default_construction

答案 2 :(得分:0)

您可以使用双端队列来容纳数量不断增加的对象,并使用向量来保存指向对象的指针。如果只将新对象添加到它的末尾,则deque不会使指向它所拥有的现有对象的指针无效。这比分别分配每个对象要少得多。只需确保deque在向量之后或与向量同时被销毁,这样您就不会创建悬空指针。

但是,根据您在另一个答案评论中提到的三维数组的大小,您可能难以存储那么多指针。您可能希望查看稀疏数组实现,以便主要将内存用于具有非空指针的数组部分。

答案 3 :(得分:0)

您可以使用智能指针。例如boost :: shared_ptr。

答案 4 :(得分:0)

The issue is that how do I get pointers in there without needing to manage my memory?

您当然可以使用shared_ptr或此处提到的其他类似技术来执行此操作。但在不久的将来,你会遇到一些问题,你必须管理自己的记忆。因此,请让自己熟悉指针概念。

通常,如果您在大型服务器中看到对象本身的内存管理被视为一种责任,并且特别为此目的,您将创建一个类。这被称为游泳池。无论什么时候你需要一个对象,你都要求池给你一个对象,每当你完成对象时,你告诉池我已经完成了。现在,池的责任是看看该对象可以做什么。

但基本的想法是你的主程序仍然处理指针,但不关心内存。还有一些其他对象关心它。

相关问题