gpt4 book ai didi

c++ - 从 vector 中删除最后一个元素会导致迭代出现问题

转载 作者:行者123 更新时间:2023-12-05 09:25:53 24 4
gpt4 key购买 nike

这是我的代码:

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
v.push_back(7);

for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
if (*it == 7)
v.erase(it);
cout << *it << endl;
}

问题是,for 循环不会停止运行并打印垃圾值。您能否就此问题提供一些见解...比如最后一个元素可能存储有关大小的信息或 end() 的地址?

使用 erase() 方法可以很好地处理 vector 中的其他位置,但最后一个元素除外。

控制台日志显示如下垃圾值:

34603778
35652354
50397954
34603592
34603536
34603536
34603536
34603536
34603794
36700688
34603536
34603536
34865684
51511824
34603536
34865680

最佳答案

无论您从 vector 中的哪个位置删除,您的程序都有未定义的行为。作为documentation说,函数:

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

所以,你的迭代器在你删除的那一刻就死了。这就是为什么该函数返回一个新的迭代器(返回到现在位于您刚刚删除的位置的项目)的原因。您必须更新循环的迭代器才能使用它。

在循环中从标准容器中删除的惯用方法是将迭代器步进循环体本身:

for (vector<int>::iterator it = v.begin(); it != v.end(); )
{
if (*it == 7) {
it = v.erase(it);
} else {
cout << *it << endl;
++it;
}
}

但是,这通常不是从 vector 中删除项目的好方法。如果 vector 包含很多要删除的值怎么办?您的操作变得非常低效,因为每次删除都必须打乱 vector 中的剩余项目。

所以更好的方法是 erase-remove idiom :

v.erase(std::remove(v.begin(), v.end(), 7), v.end());

从 C++20 开始,这是 simplified further :

std::erase(v, 7);

关于c++ - 从 vector 中删除最后一个元素会导致迭代出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74806749/

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