使用map <int,Foo>代替vector <Foo>避免指针失效

时间:2019-07-28 23:03:41

标签: c++ dictionary vector stl containers

说我有一个类Foo和一个容器vector<Foo> Foos。 我使用的算法在很大程度上依赖于指向Foos元素的指针,而且我还需要动态添加Foos并访问容器的元素。问题是,如果我向向量添加太多元素,则可能需要重新分配元素,从而使指向这些元素的所有指针无效。那么使用map<int, Foo>这样的东西代替vector<Foo>是否有意义?

4 个答案:

答案 0 :(得分:1)

我会使用std::vector<std::shared_ptr<Foo>>,所以我仍然有一个向量,无论它们在向量中的位置如何,我仍然需要有效的指针。

答案 1 :(得分:1)

std::deque具有与vector类似的性能(和随机访问),但不会在插入时使指针无效。

尽管如此,它确实会使删除指针无效。

答案 2 :(得分:0)

预分配

如果事先知道向量可以包含的Foo对象的最大数目,则可以使用std::vector::reserve()成员函数简单地重新分配向量的缓冲区。这样,就不会发生对象的重新分配,因此指向Foo对象的指针不会失效。

使用指针向量

或者,您可以使用std::vector<std::unique_ptr<Foo>>代替std::vector<Foo>。这样,即使向量重新分配了其元素,指向的Foo对象的地址也不会更改,因为它将是将重新分配的std:unique_ptr<Foo>对象,而不是{{1} }对象。因此,指向Foo对象的指针仍然有效。

答案 3 :(得分:0)

您有四种可能性:

  • 您使用的是非无效容器。那是你的建议。

  • 您事先在向量中保留了足够的空间(El Professor's answer)。仅当您事先知道Foo的最大数量时,此方法才起作用。

  • 您使用(智能)指针(Michael Chourdakis' answer)的向量。只要您不需要将指针用作迭代器,此方法就起作用。

  • 您没有对vector<Foo>进行任何更改,但是使指针可以使用算法来代替指针。这样,您就可以在检查向量边界之前和之后查看元素,并且索引不会因重新分配而无效。