Skip to content

C++坑点记录- set删除

最近在写一道Facebook hacker cup的题时,需要使用平衡树维护操作。遂调用了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(5);
    del(now);
    now++;
}

上面是我原来的写法,删除这个迭代器所在的位置,然后移位。
但理想很美好,现实有差距。在我用标程对拍以后,我发现上述操作存在很大问题。
使用erase操作删除一个迭代器以后,我访问该迭代器,他仍旧是原来的值。
但当我想要左右移位时,经测试发现不管你左移还是右移,他返回的都是删除的迭代器在原set中的前一个位置。
也即

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

了解这个就好办了,我预先存下我要删除的位置,然后迭代器先更新,再调用删除即可。
这个主要还是对STL不够熟悉造成的,为此,我后来还去翻阅了set中erase操作的函数原型及返回值

3 Comments

  1. 顶一下。。。。博主能力很强。。。

    星期一, 3月 20, 2017 at 16:26 | Permalink
  2. 代理记账 wrote:

    博主一直都在进步呢。。。

    星期一, 5月 8, 2017 at 23:43 | Permalink
  3. 胜利的领域和责任为您提供了更好的选择。 您可以在这里始终获得最佳功能,并可以使用进行移动,以便找到该字段中的目的地。

    星期二, 6月 26, 2018 at 23:59 | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*