我对c ++ std迭代器有疑问。
假设iter
是std::set<SomeType>::iterator
类型。
时:
iter = ++iter
与:
相同++iter
或者他们有什么不同?
编辑:
我找到了代码std::set<UserDefinedClass*>::iterator
以这种方式使用。 (指针)
我想知道这是否会导致程序我调试失灵
我正在阅读答案,但很难判断哪个答案是正确的。
答案 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