Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针的std::向量?_C++_Vector - Fatal编程技术网

C++ 指针的std::向量?

C++ 指针的std::向量?,c++,vector,C++,Vector,这就是我要做的。我有一个包含一定数量元素的std::vector,它可以增长,但不能收缩。问题是它的细胞是以细胞为基础的,所以在这个位置上可能没有任何东西。我没有创建一个空对象和浪费内存,而是想在std::vector中清空该单元格。问题是,如何在不需要管理内存的情况下获取指针?我如何利用不必进行新操作并跟踪指针的优势?如果要使用指针,则需要一些东西来管理内存 听起来最好的解决方案是使用boost::optional。我相信它正是你想要的语义。(). 实际上,在我写了这篇文章之后,我意识到您的

这就是我要做的。我有一个包含一定数量元素的std::vector,它可以增长,但不能收缩。问题是它的细胞是以细胞为基础的,所以在这个位置上可能没有任何东西。我没有创建一个空对象和浪费内存,而是想在
std::vector
中清空该单元格。问题是,如何在不需要管理内存的情况下获取指针?我如何利用不必进行新操作并跟踪指针的优势?

如果要使用指针,则需要一些东西来管理内存

听起来最好的解决方案是使用boost::optional。我相信它正是你想要的语义。().


实际上,在我写了这篇文章之后,我意识到您的用例(例如昂贵的默认构造函数)是由boost::optional docs使用的:

如果您要使用指针,则需要一些东西来管理内存

听起来最好的解决方案是使用boost::optional。我相信它正是你想要的语义。().


实际上,在我写了这篇文章之后,我意识到boost::optional docs使用了您的用例(例如昂贵的默认构造函数):

对象有多大,您预计向量会有多稀疏?如果对象不大或者没有很多洞,那么拥有几个“空”对象的成本可能低于动态分配对象和管理指向它们的指针的成本


这就是说,如果您确实希望在向量中存储指针,您将需要使用智能指针向量(例如
向量)或设计用于拥有指针的容器(例如Boost的
ptr_向量
)?如果对象不大或者没有很多洞,那么拥有几个“空”对象的成本可能低于动态分配对象和管理指向它们的指针的成本


这就是说,如果您确实想在向量中存储指针,那么您需要使用智能指针向量(例如
向量
)或设计用于拥有指针的容器(例如Boost的
ptr_向量
)。

您可以使用deque来保存数量不断增加的对象,并使用向量来保存指向对象的指针。如果只在deque的末尾添加新对象,则deque不会使指向其持有的现有对象的指针无效。这比单独分配每个对象的开销要少得多。只需确保deque在向量之后或与向量同时被销毁,这样就不会创建悬空指针


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

您可以使用deque来保存数量不断增加的对象,并使用向量来保存指向这些对象的指针。如果只在deque的末尾添加新对象,则deque不会使指向其持有的现有对象的指针无效。这比单独分配每个对象的开销要少得多。只需确保deque在向量之后或与向量同时被销毁,这样就不会创建悬空指针


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

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

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

问题是如何在不需要管理内存的情况下获取指针

您当然可以使用shared_ptr或这里提到的其他类似技术来实现这一点。但在不久的将来,您将遇到一些问题,您将不得不管理自己的内存。因此,请您熟悉指针的概念

通常,如果您在大型服务器中看到对象本身的内存管理被认为是一项职责,并且为此您将创建一个类。这就是所谓的游泳池。无论何时你需要一个对象,你都会要求游泳池给你这个对象,无论何时你处理完这个对象,你都会告诉游泳池我已经完成了。现在,池的责任是查看如何处理该对象


但基本思想是,主程序仍然处理指针,但不关心内存。还有其他一些物体关心它

问题在于,如何在不需要管理内存的情况下获取指针

您当然可以使用shared_ptr或这里提到的其他类似技术来实现这一点。但在不久的将来,您将遇到一些问题,您将不得不管理自己的内存。因此,请您熟悉指针的概念

通常,如果您在大型服务器中看到对象本身的内存管理被认为是一项职责,并且为此您将创建一个类。这就是所谓的游泳池。无论何时你需要一个对象,你都会要求游泳池给你这个对象,无论何时你处理完这个对象,你都会告诉游泳池我已经完成了。现在,池的责任是查看如何处理该对象


但基本思想是,主程序仍然处理指针,但不关心内存。还有其他一些物体关心它

你能展示一下你打算如何使用这个容器吗?(更大的图片,而不是步骤)你不应该害怕使用新的和删除,它们是C++的基础部分。最重要的是将指针设置为