2011-07-14 62 views
1

如何在std :: vector中引用特定元素?常量引用std :: vector

简单的方法应该是将其存储为元素的索引(我正在使用size_t变量)。

我遇到的问题是在当前插入元素的可能性,使存储的值不正确。

+3

也许'std :: vector'不是您需要的正确容器。你想做什么? –

+0

@Fred Larson @templatetypedef我不想指出元素本身,我想指出它的位置。我创建的是一个在多边形中使用布尔操作的算法,我需要找到两个多边形之间的交点,并知道一个在另一个多边形中的相同位置,所以我可以从一个多边形跳到另一个多边形。我想到std :: list,但我不知道它是否允许我做这样的事情。 – Wanderson

回答

1

唯一可靠的解决方案是让你的矢量是一个指针矢量,只记住你的指针。

否则,你不能保持一个引用,因为,正如你所提到的,向量可能会移动元素。

4

通过指针,引用或索引来跟踪vector中的单个元素的方法并不是很好。特别是:

  1. 如果你插入一个新元素到vector,它可能会导致在发生内部重新分配到无效的vector的元素的所有未完成的引用。插入可以通过调用insert,reserve,push_backassign(可能还有其他几个)来实现。这可能会导致引用引用无效的对象,如果使用该引用,则会导致未定义的行为。

  2. 如果您从vector中删除元素,则引用可能不再指向同一元素。访问参考可能会导致您引用错误的对象。

如果你真的必须持有一个vector一个元素的引用,其中一个方案是有vector店(智能)对象的指针,而不是对象本身。这样,您可以在其他地方存储该指针的副本,而不管vector中发生了什么,指针应该仍然有效。这实际上是软件工程的基本定理 - 增加另一层间接寻址可以解决大多数问题。

0

使用包含自动指针的向量,即如果您使用C++ 0x,则使用std::vector<std::unique_ptr<YOUR_ELEMENT_TYPE>>