【问题标题】:handling for references affected by adding elements to std::vector处理受向 std::vector 添加元素影响的引用
【发布时间】:2017-01-09 14:26:39
【问题描述】:

正如answer to another question 中所指出的,在将新元素添加到该向量后,指向向量元素的所有指针都可能变得无效,这是由于底层连续缓冲区的重新分配。

有没有一种安全的方法可以在编译时处理这个问题?

是否有最佳实践来处理或避免在更改数据结构后引用可能变得无效的情况?

【问题讨论】:

  • 在 c# 中,当我在迭代器处于活动状态时添加元素时会出现异常。我可以在 C++ 中重新创建这种行为吗?
  • 我可以告诉编译器在我存储对向量中元素的引用时抛出错误吗?如果是这样,我可能会通过始终按索引获取元素来解决此问题。

标签: c++ vector reference compiler-warnings stdvector


【解决方案1】:

是否有最佳实践来处理或避免在更改数据结构后引用可能变得无效的情况?

  • 提前为向量预分配足够的空间
  • 在数组中保留对象的索引,而不是指向对象本身的引用/指针
  • 使用不同的容器,例如std::list

哪种方式最适合你,取决于你的情况

【讨论】:

    【解决方案2】:

    指向 std::vector 本身的指针或引用不会改变。由于依赖于实现的重新分配策略,可能会改变 std::vector 中特定元素的地址。

    预先分配足够的空间是有风险的,因为您不应该依赖特定的实施策略。

    在 std::vector 中存储元素的地址是一个坏主意,并且可以很容易地避免,因为 std::vector [] 运算符非常快,因此存储索引而不是元素的地址。这是正确的方式。

    【讨论】:

    • 这应该是评论,而不是答案。我认为可以肯定地假设这就是 OP 的意思,只是措辞不佳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2016-04-06
    • 2019-07-09
    • 2022-01-19
    • 2014-03-15
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多