如何在vector.push_back()引起重新分配后获取向量迭代器指向向量的方法?

3
我有一个函数 void AddEntity(Entity* addtolist),它将元素推回到一个 vector 中,但由于在将元素添加到 vector 时大小和容量相等,所以 vector 重新分配了空间,导致 iterator 变为无效。

然后当我尝试增加迭代器时,由于无效的迭代器而崩溃,由于 push_back(...) 不返回指向重新分配内存的迭代器,我想知道如何解决这个问题。

我应该只使用 insert(...) ,因为它确实返回一个 iterator,还是应该使用一个指针来存储对重新分配后的向量的引用,然后使 iterator 等于指向重新分配的 vector 的指针?


由于您正在使用向量,因此可以使用整数或size_t来自己跟踪索引! - leetNightshade
即使在使用push_back之后,为什么您仍然要使用先前的迭代器? - Nawaz
2
@leetNightshade - 我很高兴有其他人也推荐使用 size_t,但在这种情况下,正确的类型应该是 std::vector<T>::size_type - Chris Lutz
insert 返回插入元素的迭代器。push_back 不返回迭代器,因为新元素的位置非常明显! - Bo Persson
@Chris Lutz - 哦,好的,谢谢!是的,我只提到int是因为有些人似乎很喜欢使用它,但我倾向于使用size_t,这样我就可以避免错误并利用64位平台,或者进一步利用其他平台,如128位等。所以,谢谢,我会记住的。 - leetNightshade
2个回答

8
vector::push_back(const T& x);

在当前向量的最后一个元素之后添加一个新元素。这个新元素的内容是x的副本。
这实际上将向量的大小增加了一,如果调用前向量大小等于向量容量,则会导致内部分配的存储重新分配。重新分配会使所有先前获得的迭代器、引用和指针失效。
使用无效的向量会导致崩溃或未定义的行为。因此,只需使用vector::begin()获取一个新的迭代器即可。
vector<int> myvector;

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

@Als 嗯,我之前尝试过这个,但它仍然无效并导致崩溃。 - thatguyoverthere
1
@只是一个谦逊的程序员:如果你在push_back之后重新分配内存并获得一个新的迭代器,那么它不会崩溃。 - Alok Save
@Als,我正在使用的迭代器是属于处理列表并更新存储在向量中元素的类的一部分。如果当前的迭代器是该类的一部分,我该如何获取一个新的迭代器呢?我是否应该创建一个临时迭代器,并使旧的迭代器指向新的迭代器? - thatguyoverthere
@只是一个谦逊的程序员:别再担心重新分配内存后旧迭代器的问题了!在 push_back() 后,你可以直接使用 myvector.begin() 分配的迭代器。 - Alok Save
@Als,这是我一直以来的做法,即使在更新向量单个元素的函数中,首先将迭代器设置为列表的开头,但程序仍会崩溃并显示“Vector iterator not incrementable”运行时错误。我认为这是因为迭代器无效,所以不能进行递增操作。 - thatguyoverthere
@Als 我一直在调试器中折腾,发现另一个函数导致迭代器在遍历过程中重新回到列表的开头。无论如何,还是非常感谢您的帮助。 - thatguyoverthere

0
如@Als已经回答的那样,如果发生重定位,push_back()可能会使所有迭代器无效。
根据您尝试解决的问题,std::list可能是您需要的。向list添加元素不会使容器中现有的迭代器无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接