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

问题描述 投票:0回答:2

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

*it++

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

在 C++ 参考中,* 运算符低于后缀运算符:http://en.cppreference.com/w/cpp/language/operator_precedence

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

c++ iterator
2个回答
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;
}

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

如果编写程序来使用预自增的方式简单明了,则可能会获得更好的性能,减少编译器的工作量,或者两者兼而有之。

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


0
投票

不,它对于仅支持

std::input_iterator
概念的迭代器无效。

因为

std::input_or_output_iterator
概念不需要后缀增量 (
it++
) 返回值。
它可能会返回
void
,然后
*it++
将无法编译。

© www.soinside.com 2019 - 2024. All rights reserved.