>正如在回答另一个问题时指出的那样,由于重新分配了底层连续缓冲区,在向量的新元素添加到该向量后,指向该向量元素的所有指针都可能变得无效。
有没有一种安全的方法在编译时处理这个问题?
是否有最佳实践来处理或避免更改数据结构后引用可能变得无效的情况?
是否有最佳实践来处理或避免更改数据结构后引用可能变得无效的情况?
- 提前为矢量预分配足够的空间
- 将对象的索引保留在数组中,而不是指向对象本身的引用/指针
- 使用不同的容器,例如
std::list
哪种方式最适合您取决于您的情况
指向 std::vector 本身的指针或引用不会更改。可以更改的是 std::vector 中特定元素的地址,这是由于依赖于实现的重新分配策略。
预分配足够的空间是一种风险,因为您不应该中继特定的实现策略。
将元素的地址存储在 std::vector 中是一个坏主意,可以很容易地避免,因为 std::vector [] 运算符非常快,因此存储索引而不是元素的地址。这是正确的方式。