gpt4 book ai didi

c++ - vector 删除无需设置 iter 返回值即可工作

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

我们都知道在 for 中使用 erase 时,我们必须重新设置 iter,比如 iter = vector.erase(iter),因为 erase 选项会使 iteraor 失效。但是我发现,不重置也可以,代码如下:

int main() {
vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(2);
a.push_back(10);
a.push_back(11);
for (vector<int>::iterator iter = a.begin(); iter != a.end();) {
if (*iter == 2) {
// iter = a.erase(iter); the same
a.erase(iter);
continue;
} else {
iter++;
}
}
for (vector<int>::iterator iter = a.begin(); iter != a.end(); iter++) {
cout << *iter << " ";
}
cout << endl;
return 0;
}

代码运行成功,输出:1 3 10 11。

所以我的问题是“a.erase(iter)”在这段代码中得到的结果与“iter = a.earse(iter)”相同?

最佳答案

您看到的是未定义的行为。

来自 http://en.cppreference.com/w/cpp/container/vector/erase (强调我的)

Removes specified elements from the container.
1) Removes the element at pos.
2) Removes the elements in the range [first; last).

Invalidates iterators and references at or after the point of the erase, including the end() iterator.

通过使用

a.erase(iter);
continue;

您正在访问一个无效的迭代器。

关于c++ - vector 删除无需设置 iter 返回值即可工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758025/

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