gpt4 book ai didi

C++ vector erase advances 迭代器

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:21 25 4
gpt4 key购买 nike

以下简化代码有效,因为它删除了所有 vector 元素。但是,我不明白为什么。由于 f.erase(r) 没有捕获返回值,这将是新的迭代器值,并且没有其他迭代器增量器,并且 according to documentation, erase(iterator position) 参数不是按引用传递的,迭代器从哪里前进?

#include <iostream>
#include <vector>

int main ()
{
std::vector<int> f = {1,2,3,4,5};
auto r = f.begin();
while (r != f.end())
{
std::cout << "Erasing " << *r << std::endl;
f.erase(r);
}
return 0;
}

最佳答案

where does the iterator get advanced?

它不会,迭代器保持指向同一个位置。这在技术上是未定义的行为,但如果您考虑循环实际在做什么,您就会明白为什么会得到“正确”的结果。

您的 vector 包含一个指向它存储的对象的指针。您的迭代器将指向该内存,并带有您想要的元素的偏移量。在这种情况下,它将指向数据的开头。当您删除第一个元素时,迭代器将失效,但它仍指向 vector 的开头。 erase 将所有元素向前移动,因此当您进入下一次迭代时,您的状态与第一次迭代时相同,只是 vector 小了一个元素。您重复执行此操作,直到没有剩余元素并且 end() == begin()

你不应该依赖于这种情况总是发生,而只是使用 clear() 从 vector 中删除所有元素。

关于C++ vector erase advances 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58561570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com