当您将push_back()项放入std::vector中,并通过back()引用保留指向向量中对象的指针时--是否保证(假设没有删除)向量中对象的地址将保持不变?
我的向量似乎改变了我使用的对象的指针,这样,如果我将10个条目推入其中,并在每个back()之后记住push_back引用,从而保留对这10个条目的指针。
如果您的向量要存储对象,而不是对象的指针,那么这些对象的地址在推送更多项时是否会经常发生更改?
发布于 2014-05-19 19:54:01
任何导致向量自身调整大小的方法都将使所有迭代器、指针和对包含在其中的元素的引用失效。可以通过保留记忆或使用boost::stable_vector来避免这种情况。
23.3.6.5/1:
备注:如果新的大小大于旧容量,将导致重新分配。如果没有重新分配,插入点之前的所有迭代器和引用仍然有效。
发布于 2014-05-19 19:52:52
不,std::vector不是一个稳定的容器,即指针和迭代器可能通过调整向量的大小而失效(或者更好的是通过相应的重新分配)。如果您想避免这种行为,请使用boost::stable_vector、std::list或std::deque (我更喜欢最后一种)。或者,更容易地,您可以简单地存储您的位置通过索引。
有关更多信息,还请考虑here这个问题的答案。
发布于 2014-05-19 19:57:21
这不能保证。如果您的push_back项超过了作为向量后备存储的内存缓冲区的大小,则将创建一个新缓冲区,将所有内容复制到新位置,并删除旧缓冲区。此时,旧指针(以及迭代器!)是无效的。
如果您确切地知道您将需要多少最大空间,则可以在创建向量缓冲区时将其大小设置为该大小,以避免重新分配。但是,我更喜欢将对向量元素的“引用”存储为对向量和size_t索引的引用,而不是使用指针。它不一定比指针慢(取决于CPU类型),但即使是这样,它也不会慢得多,在我看来,这是值得的,因为我知道,无论将来如何使用或重新分配向量,它仍然会引用适当的元素。
https://stackoverflow.com/questions/23746042
复制相似问题