说我有一个类Foo
和一个容器vector<Foo> Foos
。
我使用的算法在很大程度上依赖于指向Foos
元素的指针,而且我还需要动态添加Foos并访问容器的元素。问题是,如果我向向量添加太多元素,则可能需要重新分配元素,从而使指向这些元素的所有指针无效。那么使用map<int, Foo>
这样的东西代替vector<Foo>
是否有意义?
答案 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>
进行任何更改,但是使指针可以使用算法来代替指针。这样,您就可以在检查向量边界之前和之后查看元素,并且索引不会因重新分配而无效。