【问题标题】:How to get a vector iterator to point to a vector after vector.push_back() has caused reallocation?在 vector.push_back() 导致重新分配之后,如何让向量迭代器指向一个向量?
【发布时间】:2021-11-13 16:02:45
【问题描述】:

我有一个函数void AddEntity(Entity* addtolist) 将元素推回vector,但由于将元素添加到vector 时大小和容量相等,因此向量重新分配并且iterator 变得无效。

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

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

【问题讨论】:

  • 由于您使用的是向量,因此您可以只使用整数或 size_t 来自己跟踪索引!
  • 为什么即使在push_back 之后还要使用以前的迭代器?
  • @leetNightshade - 我很高兴我以外的其他人推荐了一次size_t,但在这种情况下,正确的类型应该是std::vector<T>::size_type
  • insert 返回插入元素的迭代器。 push_back 没有,因为很明显新元素在哪里!
  • @Chris Lutz - 哦,好的,谢谢!是的,我只提到 int 是因为有些人似乎热衷于使用它,但我倾向于坚持 size_t,所以我可以防止错误并利用 64 位平台,或者进一步利用其他平台,如 128 位等。所以,谢谢,我会记住这一点的。

标签: c++ vector iterator


【解决方案1】:

正如@Als 已经回答的那样,如果发生重定位,push_back() 可能会使所有迭代器无效。

取决于您尝试解决的问题,std::list 可能是您需要的。向list 添加元素不会使容器的现有迭代器失效。

【讨论】:

    【解决方案2】:
    vector::push_back(const T& x);
    

    在向量的最后一个元素之后添加一个新元素。这个新元素的内容被初始化为 x 的副本。

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

    使用无效的向量会导致崩溃或未定义的行为。
    所以只需使用vector::begin() 获取一个新的迭代器。

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

    【讨论】:

    • @Als 嗯,我以前试过这个,但它似乎仍然无效并崩溃
    • @只是一个不起眼的程序员:如果你在 push_back 之后重新分配 之后获得一个新的迭代器,它不会崩溃。
    • @Als 我正在使用的迭代器是处理列表并更新存储在向量中的元素的类的一部分。如果当前的迭代器是类的一部分,我该如何去获得一个新的迭代器?我应该创建一个临时迭代器并让旧迭代器指向新迭代器吗?
    • @只是一个不起眼的程序员:在重新分配期间忘记旧的迭代器!你不能在push_back() 之后用myvector.begin() 分配你已经拥有的迭代器。
    • @Als 我一直都有它,即使在更新向量的各个元素的函数中,首先将迭代器设置为列表的开头,但程序因“向量迭代器而崩溃不可递增”运行时错误,我假设因为迭代器无效,所以它不能递增
    猜你喜欢
    • 2017-08-29
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2016-05-11
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多