欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

C++中关于set删除的一些坑

来源:本站原创|时间:2020-01-10|栏目:C语言|点击:

前言

最近工作中需要使用平衡树维护操作。遂调用了C++标准库里的set,在确保解题思路没有出错的情况下,我发现自己始终有一组样例无法通过。在检查了很久的细节并找了标程对跑中间过程以后,我发现我在使用set做删除的时候,迭代器发生了和我预想不一样的变化。

我在一个函数中调用了set的erase操作来删除某个迭代器,函数的传入参数为要删除的迭代器,类似如下

set<int> aha;
 
void del(set<int>::iterator it)
{
 //一顿操作
 aha.erase(it);
}

然后我在main中想要删除一个迭代器,并左移一位或右移一位迭代器,类似如下

int main()
{
 set<int>::iterator now;
 //一顿操作
 
 //操作1
 now=aha.find(5);
 del(now);
 now--;

 //操作2
 now=aha.find(8);
 del(now);
 now++;
}

上面是我原来的写法,删除这个迭代器所在的位置,然后移位。

但理想很美好,现实有差距。在我用标程对拍以后,我发现上述操作存在很大问题。

使用erase操作删除一个迭代器以后,我访问该迭代器,他仍旧是原来的值。

但当我想要左右移位时,经测试发现不管你左移还是右移,他返回的都是删除的迭代器在原set中的前一个位置。
也即

set<int>::iterator now=aha.find(8);
del(now);
/*
现在--now和++now都是同一个位置
为未删除now的set中,now的前一个位置
*/

了解这个就好办了,我预先存下我要删除的位置,然后迭代器先更新,再调用删除即可。

这个主要还是对STL不够熟悉造成的,为此,我后来还去翻阅了set中erase操作的函数原型及返回值。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

上一篇:引用numpy出错详解及解决方法

栏    目:C语言

下一篇:javascript 两种声明函数的方式的分析

本文标题:C++中关于set删除的一些坑

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1767.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有