1

我正在努力理解将引用或指针安全地存储在容器中的项目的最佳方法,而不会冒指针可能会失效的风险。

std::vector一般来说,这似乎是一个坏主意,因为您永远不知道您的项目何时可能会在重新分配时被移动到新的内存位置vector。有没有这样的方法?

使用list并且deque这是一个更好的选择吗?据我了解,这些集合中的项目不会四处移动,所以我可以只使用指向特定元素的内存地址的指针吗?

我来自Objective-C,因为Objective-C几乎使用指针来处理所有东西,所以这种事情在它的所有容器中都很容易和常见,因此将它们折腾并复制它们是很常见的。

4

3 回答 3

3

对于 a std::vector,您可以使用reserve成员函数来确保为您需要的最大数量的元素预先分配一个连续的内存块。这意味着除非超出保留容量,否则不会复制元素。

在插入或删除元素时,所有指向 astd::deque中元素的指针也会失效。但是,std::list除了指向您正在擦除的元素的指针之外,保证在这些情况下不会使任何指针无效。

于 2013-05-08T11:58:00.273 回答
0

列表是序列容器,允许您在任何地方插入和擦除并在两个方向上迭代。与向量相比,列表的主要缺点是它们无法通过位置直接访问元素。

双端队列也是序列容器。它们具有动态尺寸,可以在两端扩展或收缩。它们与矢量非常相似,并通过它们的位置为您提供对元素的直接访问。

您需要问自己:我需要对容器进行哪些操作?

请注意, list 和 forward_list 在操作时保留容器的有效性,而 deque 使其无效。

访问http://www.cplusplus.com/了解更多关于 C++ 容器的信息。

于 2013-05-08T12:02:09.177 回答
0

解决方案是让向量保存指向对象的指针,而不是让它直接包含对象。然后您不必担心向量的大小调整,因为当它调整大小时,对象将保留在内存中的原始位置。

于 2013-05-08T15:07:31.533 回答