在移除和重新插入元素时在树上循环
Iterating over a tree while removing and reinserting an element
看看下面的代码摘录:
while( *it <= *it_end and it != myset.end() )
if(foo(*it++))
return true;
it
和it_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++函数调用中使用增量运算符合法吗?
相关文章:
- 擦除while循环中迭代的元素
- C++:如何循环通过向量中的整数元素
- 对于set上的循环-获取next元素迭代器
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++基于范围的 for 循环和元素副本
- 这个返回元素位置的基于循环的函数有什么问题?
- 为什么我在尝试在单向链表中打印元素时会出现这个永无止境的循环
- 循环访问还包含未使用元素的字符串数组
- C++用于循环跳过向量的元素?
- 基于相邻元素 c++ 的分段误差范围的循环
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 需要帮助编写一个小程序来将循环乘以 n 个元素和 k 个多重性
- C++ 数据结构队列:使用 for 循环查找队列中最大的元素
- 将函数应用于特征矩阵中的所有元素,而无需循环
- 使用 C++ 从每个循环的数组中选择 n 个元素
- 忽略元素的基于范围的 for 循环
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- 用于随机访问和元素循环的最佳数据结构(C++)