首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::向量和指针可预测性

std::向量和指针可预测性
EN

Stack Overflow用户
提问于 2014-05-19 19:49:57
回答 3查看 70关注 0票数 0

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

我的向量似乎改变了我使用的对象的指针,这样,如果我将10个条目推入其中,并在每个back()之后记住push_back引用,从而保留对这10个条目的指针。

如果您的向量要存储对象,而不是对象的指针,那么这些对象的地址在推送更多项时是否会经常发生更改?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-19 19:54:01

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

23.3.6.5/1:

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

票数 0
EN

Stack Overflow用户

发布于 2014-05-19 19:52:52

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

有关更多信息,还请考虑here这个问题的答案。

票数 0
EN

Stack Overflow用户

发布于 2014-05-19 19:57:21

这不能保证。如果您的push_back项超过了作为向量后备存储的内存缓冲区的大小,则将创建一个新缓冲区,将所有内容复制到新位置,并删除旧缓冲区。此时,旧指针(以及迭代器!)是无效的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23746042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档