在移除并重新插入元素的同时迭代树

时间:2015-11-30 18:57:48

标签: c++ tree red-black-tree

看看这段代码摘录:

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树的自平衡算法一样。

1 个答案:

答案 0 :(得分:0)

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

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

  

迭代器有效期:

     

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

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

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

[C ++标准] [1] 1.9.16(取自以下链接):

  

调用函数时(无论是否为   每个人都不是内联的功能   价值计算和副作用   与任何参数相关联   表达式,或与后缀   表达被称为的表达   功能,之前是排序的   执行每个表达式或   在被召唤的身体中的陈述   功能。 (注意:价值计算   与...相关的副作用   不同的参数表达式   未测序。)

此处可以找到更多内容:Is it legal to use the increment operator in a C++ function call?