C++中关于set删除的一些坑
前言 最近工作中需要使用平衡树维护操作。遂调用了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操作的函数原型及返回值。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- applicationContext.xml和dispatcher-servlet.xml的区别
- postgresql – 如何删除Postgres中的复制槽9.4
- actionscript-3 – Adob??e Air – 检查互联网连接
- tdd – Jasmine测试coffeescript期望(setTimeout).toHaveBe
- 如何从firebug控制台隐藏ajax请求?
- ruby-on-rails – Rails有很多,属于一个
- 用c语言实现一些简单程序。
- react-bits:数组作为子元素
- TOAD连接Oracle数据库失败:OCI_INVALID_HANDLE解决
- 使用#pragma在Xcode中禁止“找不到实例方法”警告