如何对动态移动其对象的容器拥有的对象进行有效引用?

问题描述

如果您有一个指向容器中包含的对象的指针或引用,例如动态数组或哈希表/映射,则存在的问题是对象不会永久保留在那里,因此似乎对这些对象的任何引用对象很快就会失效。例如,一个动态数组可能需要重新分配,一个哈希表可能需要重新哈希,改变数组中桶的位置。

在像 Java(我认为是 C#)这样的语言中,可能还有大多数语言,这可能不是问题。在这些语言中,很多东西是引用而不是对象本身。您可以创建对动态数组的第三个元素的引用,基本上是通过复制对位于其他地方的对象的引用来创建新引用。

但是在 C++ 中,动态数组或哈希表实际上将对象直接存储在容器拥有的内存中,您应该怎么做?我创建的对象只有一个地方可以存放。我可以通过在某处分配对象来创建对象,然后将指向该对象的指针存储在动态数组或哈希表或任何其他容器中。但是,如果我决定让容器成为这些对象的所有者,我就会遇到指向这些对象的指针或引用的问题。

对于像 std::vector 这样的动态数组,您可以使用索引而不是内存地址来引用数组中的对象。如果数组被重新分配,索引仍然有效。但是,如果我删除数组中的元素,我会遇到同样的问题,那么索引可能不再有效。

在哈希表之类的情况下,该表可能会动态重新哈希,从而更改存储桶中所有值的位置。每次要访问它时,引用哈希表值的唯一方法搜索或哈希键吗?

有哪些方法可以引用位于此类或任何其他容器中的对象?

解决方法

对此没有任何魔法或常用的解决方案。你必须做出权衡。如果您在这种低级别优化事物,一种好的方法可能是使用容器类,当它进行重新分配时会通知您。找出是否有任何具有此属性的容器库会很有趣