在输入迭代器*it++
上执行此操作是否有效?
我理解代码如下,它取消引用迭代器并给我值,然后提前一步。
在c ++引用中,*运算符低于后缀运算符:http://en.cppreference.com/w/cpp/language/operator_precedence
但我读到这种风格是不好的做法。为什么呢?
答案 0 :(得分:1)
在输入迭代器
*it++
上执行此操作是否有效?
是的,这是有效的。迭代器将递增,将返回其先前的值,并且您将取消引用返回的迭代器。
但我读到这种风格是不好的做法。为什么呢?
考虑这两个实现,我刚刚从我写的一些图形代码中抽出来了:
// Pre-increment
BidirectionalIterator& operator++()
{
edge = (edge->*elem).next;
return *this;
}
// Post-increment
BidirectionalIterator operator++(int)
{
TargetIterator oldval(list, edge);
edge = (edge->*elem).next;
return oldval;
}
请注意,对于后增量,我需要首先构造一个新的迭代器来存储将返回的先前值。
如果编写程序以使用预增量是简单明了的,那么可能会有更好的性能,编译器的工作量更少,或者两者兼而有之。
不要为此疯狂(例如,重写所有循环)!这可能是微观优化。然而,人们说它的良好做法的原因是,如果你养成了使用预增量作为默认值的习惯,那么默认情况下你会获得(可能)更好的性能。