看看这段代码摘录:
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树的自平衡算法一样。
答案 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?