我有一个函数void AddEntity(Entity* addtolist)
将元素推回到vector
,但由于当元素添加到vector
时大小和容量相等,因此向量重新分配,{ {1}}无效。
然后,当我尝试增加迭代器时,由于迭代器无效而导致崩溃,因为iterator
没有向重新分配的内存返回迭代器,我想知道如何解决这个问题。
我应该只使用push_back(...)
,因为它确实返回insert(...)
,或者我应该使用指针在重新分配后存储对向量的引用,然后让iterator
等于指向重新分配的iterator
的指针?
答案 0 :(得分:6)
vector::push_back(const T& x);
在向量的末尾添加一个新元素,在其当前的最后一个元素之后。此新元素的内容初始化为x。
的副本这有效地将向量size
增加1,如果向量大小等于调用之前的向量容量,则会导致内部分配存储的重新分配。 重新分配使以前获得的所有迭代器,引用和指针无效。
使用无效的向量会导致崩溃或未定义的行为
所以只需使用vector::begin()
获得一个新的迭代器。
vector<int> myvector;
vector<int>::iterator it;
it=myvector.begin()
答案 1 :(得分:0)
正如@Als已经回答的那样,push_back()
可能会在重定位发生时使所有迭代器无效。
根据您尝试解决的问题,std::list
可能就是您所需要的。向list
添加元素不会使容器的现有迭代器无效。