【问题标题】:Input Iterator - Star and Postfix-Operator输入迭代器 - 星号和后缀运算符
【发布时间】:2018-01-23 20:24:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 因为后缀++应该记录之前的状态然后自加,所以与前缀++相比还有一些额外的工作要做。这就是为什么建议在 foo 循环中使用 ++i 的原因。
  • 我不认为它被认为是糟糕的风格,这是一个常见的成语。就像 *dest++ = *src++ 在从一个数组复制到另一个数组的循环中一样。
  • @Barmar 对于指针是的,但长期以来一直倾向于迭代器上的预增量,因为至少对于某些迭代器来说,后增量的成本要高得多。
  • @AlanStokes 这不会跳过第一个元素并尝试取消引用结束吗?
  • @Barmar 您确实需要适当地重写。以*dest = *src; ++dest; ++src; 为例。

标签: c++ iterator


【解决方案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;
}

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 2013-08-04
    • 1970-01-01
    • 2011-10-18
    • 2023-03-30
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多