在移除和重新插入元素时在树上循环

Iterating over a tree while removing and reinserting an element

本文关键字:元素 循环 插入 新插入      更新时间:2023-10-16

看看下面的代码摘录:

while( *it <= *it_end and it != myset.end() )
    if(foo(*it++))
        return true;

itit_end是std::set(RB树)的有效迭代器。

foo将:

  • 移除it,并再次插入与*it值相同的元素,返回false
  • 删除it并返回true

我的问题:

运行这个循环安全吗?

在调用foo之前,it将是树的下一个元素的有效迭代器,但我担心std::set内部的一些内部魔法会使该迭代器无效,就像RB树的自平衡算法一样。

它似乎是安全的,因为您正在使用std::set

请参阅http://www.cplusplus.com/reference/set/set/erase

迭代器有效性:

引用函数删除的元素的迭代器、指针和引用将无效。所有其他迭代器、指针和引用都保持其有效性。

增量将在调用foo()之前发生,即在移除元素之前。换句话说,增量是在迭代器有效的情况下完成的,因此它是安全的。注意,foo()仍然使用迭代器在增量之前的值进行调用。

之前发生增量的事实来自于此:

引用[C++标准][1]1.9.16(取自下面的链接):

调用函数时(无论不是函数是内联的),每个数值计算与副作用与任何参数关联表达式,或带有后缀指定被调用函数,在执行每个表达式或被叫方正文中的声明作用(注:价值计算以及与不同的参数表达式未排序。)

这里可以找到更多内容:在C++函数调用中使用增量运算符合法吗?