删除集合迭代器的值并增加迭代器。

10
我看到一个程序员写了这个。
auto it=myset.lower_bound(x);
myset.erase(it++);

我已经删除了当前迭代指针的值,如何通过后置自增运算符获取下一个迭代指针?

1
it++会将您拥有的迭代器递增,并返回旧值。因此,您可以安全地先更新自己的副本,然后再删除前一个元素。 - BoBTFish
由于这是后递增,所以应该先擦除*it然后再递增。 - Md. Ikramul Murad
1
@Murad 在执行erase操作之前,it++已经被执行了。该函数获取了it的旧值并将其删除,而调用方仍然持有it++的结果,即有效的迭代器。 - NathanOliver
有时候这段代码会运行成功 @NathanOliver。 auto it = myset.lower_bound(x); myset.erase(it); cout << *it; // 这段代码在删除过程后打印了 x 的值。 - Md. Ikramul Murad
@Murad 这是未定义行为。它可能会工作,也可能不会,但这并不正确。 - NathanOliver
显示剩余3条评论
1个回答

20

当你打电话时

myset.erase(it++);
一些事情会发生。首先,在传递给函数之前,it++被评估。当你评估it++时,其结果是it,这就是传递给函数的内容。因此,您的函数获取it的值,但调用站点中it的值是在增加后的值。这意味着当erase擦除迭代器指向的元素时,它正在擦除旧迭代器指向的内容,而您不再拥有该内容。这是从set中删除元素的一种完全有效和安全的方法。
作为替代方案,在C ++ 11中开始,erase返回下一个有效的迭代器,因此您可以使用:
it = myset.erase(it);

并且它会产生相同的效果。


也许需要补充说明,自从C++11开始,erase()返回的就是这个迭代器。 - Hatted Rooster
@GillBates 像这样作为替代方案,在C++11中,erase返回下一个有效的迭代器,因此您可以使用it = myset.erase(it),它将具有相同的效果 - NathanOliver
听起来完美。 - Hatted Rooster
1
@GillBates 已添加。 - NathanOliver
@PeteBecker 更新了语言。 - NathanOliver
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接