c ++“iter = ++ iter”做什么?它有效吗?

时间:2011-09-01 07:27:00

标签: c++ stl iterator

我对c ++ std迭代器有疑问。

假设iterstd::set<SomeType>::iterator类型。

时:

iter = ++iter 

与:

相同
++iter 

或者他们有什么不同?


编辑:

我找到了代码std::set<UserDefinedClass*>::iterator  以这种方式使用。 (指针)
我想知道这是否会导致程序我调试失灵 我正在阅读答案,但很难判断哪个答案是正确的。

3 个答案:

答案 0 :(得分:7)

这个问题没有明确的答案。答案取决于std::set<SomeType>::iterator类型的性质。如果它是用户定义的类型(即具有重载运算符的类),那么iter = ++iter的行为被定义为ans确实等同于仅仅++iter。但是,如果std::set<SomeType>::iterator是内置类型,则iter = ++iter会产生未定义的行为,因为它在一个表达式中两次修改同一个对象而没有插入序列点(违反了5/4中提出的要求)语言标准)。

因此,从理论上讲,一般情况下应该避免做类似的事情,因为在一般情况下行为是未定义的。实际上,std::set<SomeType>::iterator通常是用户定义的类型,iter = ++iter将起作用。然而,这不是在代码中使用这种表达式的理由。

答案 1 :(得分:2)

是的,他们是一回事 - 但为什么会这样呢?

答案 2 :(得分:0)

是的,同样的事情。一个更简单的案例,同样的事情:

int i = 10;   //i = 10
int j = i++;  //j = 10
int k = ++i;  //k = 12

然而

i = ++i; 

是不必要的,因为它递增i然后将i分配给i