C++ 如何让向量迭代器在vector.push_back()导致重新分配后指向向量?

C++ 如何让向量迭代器在vector.push_back()导致重新分配后指向向量?,c++,vector,iterator,C++,Vector,Iterator,我有一个函数void AddEntity(Entity*addtolist),它将元素推回向量,但由于当元素添加到向量时大小和容量相等,向量重新分配,迭代器变得无效 然后,当我尝试增加迭代器时,由于迭代器无效,我得到了一个崩溃,因为push_back(…)不会将迭代器返回到重新分配的内存中,我想知道如何解决这个问题 我应该只使用insert(…),因为它返回一个迭代器,还是应该使用一个指针,在重新分配后存储对向量的引用,然后让迭代器等于指向重新分配的向量的指针 vector::push_back

我有一个函数
void AddEntity(Entity*addtolist)
,它将元素推回
向量
,但由于当元素添加到
向量
时大小和容量相等,向量重新分配,
迭代器
变得无效

然后,当我尝试增加迭代器时,由于迭代器无效,我得到了一个崩溃,因为
push_back(…)
不会将迭代器返回到重新分配的内存中,我想知道如何解决这个问题

我应该只使用
insert(…)
,因为它返回一个
迭代器,还是应该使用一个指针,在重新分配后存储对向量的引用,然后让
迭代器等于指向重新分配的
向量的指针

vector::push_back(const T& x);
将新元素添加到向量末尾,位于其当前最后一个元素之后。这个新元素的内容被初始化为x的副本

这将有效地将向量
大小增加1,如果向量大小等于调用前的向量容量,则会导致内部分配存储的重新分配重新分配将使以前获得的所有迭代器、引用和指针无效。

使用无效向量将导致崩溃或未定义的行为。
因此,只需使用
vector::begin()
获得一个新的迭代器

向量myvector;
向量::迭代器;
it=myvector.begin()

由于@Als已经应答,
push_back()
如果发生重新定位,可能会使所有迭代器无效


根据您试图解决的问题,
std::list
可能是您所需要的。将元素添加到
列表中
不会使容器中现有的迭代器无效。

因为您使用的是向量,所以您可以自己使用整数或大小来跟踪索引!为什么在
push\u back
之后还要使用上一个迭代器?@leetNightshade-我很高兴有人推荐
size\u t
一次,但在这种情况下,正确的类型应该是
std::vector::size\u type
插入
将迭代器返回到插入的元素
push_back
没有,因为新元素所在的位置非常明显@克里斯·卢茨-哦,好的,谢谢!是的,我只提到int是因为有些人似乎热衷于使用它,但我倾向于坚持使用size\u t,这样我可以防止错误并利用64位平台,或者进一步利用128位等其他平台。所以,谢谢,我会记住这一点。@Als-hmm,我以前试过这个,但它似乎还是无效的crashes@Just一个谦逊的程序员:如果在push_back之后重新分配后获得一个新的迭代器,它不会崩溃。@我使用的迭代器是处理列表和更新向量中存储的元素的类的一部分。如果当前迭代器是类的一部分,我如何获得一个新的迭代器?我应该做一个临时迭代器,让旧的迭代器指向新的迭代器吗?@只是一个谦逊的程序员:在重新分配一段时间后,忘掉旧的迭代器吧!你不能在我一直使用的
push_back()
@Als之后,用
myvector.begin()
分配你已经拥有的迭代器吗?即使在更新向量的各个元素的函数中,它首先将迭代器设置为列表的开头,但程序会因“vector iterator not incrementable”而崩溃运行时错误,我假设因为迭代器无效,所以它不能递增
vector<int> myvector;

vector<int>::iterator it;
it=myvector.begin()