std :: vector和指针的可预测性

时间:2014-05-19 19:49:57

标签: c++ vector std stdvector c++-standard-library

当你将push_back()个项目放入std::vector,并通过back()引用保留向量中的对象的指针 - 你保证(假设没有删除),向量中对象的地址将保持不变?

我的矢量似乎改变了我使用的对象的指针,这样如果我将10个项目推入其中,并通过在每个{{1}之后记住back()引用来保留指向这10个项目的指针}。

如果你的向量是存储对象而不是指向对象的指针,那么这些对象的地址在推送更多项目时会不断变化吗?

3 个答案:

答案 0 :(得分:0)

不,std::vector不是一个稳定的容器,即指针和迭代器可能通过调整向量的大小(或者更好,通过相应的重新分配)而失效。如果您想避免此行为,请改用boost::stable_vectorstd::liststd::deque(我更喜欢最后一个)。或者,更简单地说,您可以通过索引存储您的位置。

有关详细信息,请考虑此问题的答案here

答案 1 :(得分:0)

任何导致向量调整大小的方法都会使所有迭代器,指针和对其中包含的元素的引用无效。这可以通过保留mememory或使用boost::stable_vector来避免。

23.3.6.5/1:

  

备注:如果新大小大于旧容量,则会导致重新分配。如果没有重新分配,   插入点之前的所有迭代器和引用都保持有效。

答案 2 :(得分:0)

不保证。如果push_back足够多的项目超过了向量的后备存储区的内存缓冲区的大小,将创建一个新的缓冲区,所有内容将被复制到新位置,旧的缓冲区将被删除。那时,旧指针(以及迭代器!)将无效。

如果您确切知道自己需要多少空间,可以在创建时将矢量缓冲区的大小设置为该大小,以避免重新分配。但是,我更愿意存储"参考文献"向量的元素作为向量的引用和向量的size_t索引,而不是使用指针。它不一定比指针慢(取决于CPU类型),但是,即使它是,它也不会慢得多,在我看来,它是值得的,让我们安心无论将来如何使用矢量或重新分配,它仍然会引用适当的元素。