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

Input Iterator - Star and Postfix-Operator

本文关键字:后缀 运算符 迭代器 输入      更新时间:2023-10-16

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

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

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

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

在输入迭代器*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;
}

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

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

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