【问题标题】:Constant reference std::vector常量引用 std::vector
【发布时间】:2011-07-14 21:00:27
【问题描述】:

如何引用 std::vector 中的特定元素?

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

我遇到的问题是有可能在当前元素之前插入一个元素,导致存储的值不正确。

【问题讨论】:

  • 也许 std::vector 不适合您的需求。你想做什么?
  • @Fred Larson @templatetypedef 我不想指向元素本身,我想指向它的位置。我正在创建的是一种用于在多边形中进行布尔运算的算法,我需要找到两个多边形之间的交点并知道一个在另一个多边形中的相同位置,所以我可以正确地从一个多边形跳到另一个.我想到了std::list,但我不知道它是否允许我做这样的事情。

标签: c++ stl vector stdvector


【解决方案1】:

没有很好的方法可以通过指针、引用或索引来跟踪vector 中的单个元素。特别是:

  1. 如果在vector 中插入新元素,如果发生内部重新分配,可能会导致对vector 元素的所有未完成引用无效。插入可以通过调用insertreservepush_backassign(可能还有其他一些)来进行。这可能会导致引用引用无效对象,如果使用引用会导致未定义的行为。

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

如果您确实必须在vector 中保存对元素的引用,一种选择是让vector 存储(智能)指向对象的指针,而不是对象本身。这样,您可以将该指针的副本存储在其他地方,无论vector 中发生什么,该指针应该仍然有效。这确实是实践中的软件工程基本定理 - 添加另一层间接可以解决大多数问题。

【讨论】:

    【解决方案2】:

    唯一可靠的解决方案是让你的向量成为指针向量并记住你的指针。

    否则,您将无法维护引用,因为正如您所提到的,矢量可能会移动元素。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多