输入迭代器 - 星号和后缀运算符

时间:2018-01-23 20:24:13

标签: c++ iterator

在输入迭代器*it++上执行此操作是否有效?

我理解代码如下,它取消引用迭代器并给我值,然后提前一步。

在c ++引用中,*运算符低于后缀运算符:http://en.cppreference.com/w/cpp/language/operator_precedence

但我读到这种风格是不好的做法。为什么呢?

1 个答案:

答案 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;
}

请注意,对于后增量,我需要首先构造一个新的迭代器来存储将返回的先前值。

如果编写程序以使用预增量是简单明了的,那么可能会有更好的性能,编译器的工作量更少,或者两者兼而有之。

不要为此疯狂(例如,重写所有循环)!这可能是微观优化。然而,人们说它的良好做法的原因是,如果你养成了使用预增量作为默认值的习惯,那么默认情况下你会获得(可能)更好的性能。