我的对象在矢量中的地址发生了变化
这个问题在这里已经有了答案:
您正在for
循环中调用vec.push_back(a)
。 因此,如果空间不足,向量可能会重新分配基础数组。 因此,如果先前元素的地址被复制到新的内存位置,则其地址不再有效。
比如说你分配了3个元素并存储了他们的地址。 在推回第四个元素之后,矢量必须重新分配。 这意味着前3个元素将被复制到一个新的位置,然后第4个将被添加。 因此,您为前3个地址存储的地址现在无效。
在调用vector<T>::push_back()
时,不保证迭代器(以及引用和对象地址)保留。 如果新size()
大于当前capacity()
,则会发生重新分配,并且将所有元素移动或复制到新位置。
为了避免这种情况,您可以在开始插入之前调用reserve()
。
std::vector
一个主要特性是它将其元素存储在连续的内存中 (当访问现代CPU上的矢量项时,这对性能很好)。
不利的一面是当矢量的预分配内存已满并且您想要添加新项目(例如调用vector::push_back()
)时,矢量必须分配另一块连续内存,并且复制/移动从以前的位置到新的位置的数据。 作为重新分配和复制/移动的结果,旧项目的地址可能会改变。
如果由于某种原因,你想保留对象的地址,而不是将这些对象的实例存储在std::vector
,你可以考虑有一个指向对象的向量的向量。 在这种情况下,即使在重新分配之后,对象指针也不会改变。
例如,您可以将shared_ptr
用于vector
的项目和multimap
的项目:
vector<shared_ptr<const A>> vec;
multimap<shared_ptr<const A>, const double> mymultimap;
链接地址: http://www.djcxy.com/p/73333.html