繁体   English   中英

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

[英]std::vector and pointer predictability

当将push_back()项目推入std::vector并通过back()引用保留指向矢量中对象的指针时-您可以保证(假设不发生删除)矢量中对象的地址保持不变?

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

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

不, std::vector不是稳定的容器,即,指针和迭代器可能会因调整Vector的大小(或更佳地是通过相应的重新分配)而失效。 如果要避免这种行为,请改用boost::stable_vectorstd::liststd::deque (我希望使用后者)。 或者,更容易地,您可以仅按索引存储位置。

有关更多信息,请在此处也考虑此问题的答案。

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

23.3.6.5/1:

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

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

如果您确切知道将需要多少最大空间,则可以在创建向量时将向量缓冲区的大小设置为该大小,以避免重新分配。 但是,我更喜欢存储对向量元素的“引用”作为对向量的引用以及对向量的size_t索引,而不是使用指针。 它不一定比指针慢(取决于CPU类型),但是即使它变慢也不会慢很多,我认为值得一提的是,无论向量如何在指针中使用将来或重新分配,它仍将引用适当的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM