如何为 C++ 自定义迭代器覆盖 *i++?

How to override *i++ for c++ custom iterator?

这让我很困惑,我正在实现一个自定义迭代器,我在这里读到:http://en.cppreference.com/w/cpp/concept/InputIterator*iter++ 的行为应该首先使用取消引用运算符,然后递增返回值(被复制)乘以 1.

我在我的自定义迭代器中覆盖了 operator*operator++(int v),问题是当我执行 *iter++operator++(int v)operator* 之前被调用,这是正确的行为,但不是我想做的(我猜?)。

如果你阅读 link,你会看到在 table 的最后一行,据说如果你执行 *iter++,你的实现应该首先取消引用,然后递增结果,这不是默认行为。

我真的不知道该怎么做,有什么想法吗?

理解后回答,标题误导,抱歉!

谢谢,

约翰

根据您提供的 link,*i++ 等同于:

value_type x = *i; // (1)
++i;               // (2)
return x;          // (3)

  1. 取消引用迭代器 i 并将其存储在 x
  2. 增加迭代器
  3. Return 值 x 通过在 递增迭代器之前取消引用 获得。

这可以用在接受输入迭代器的模板代码中,如下所示:

template <typename InputIterator, typename T>
InputIterator drop_until (InputIterator i, T const & x)
{
    while (*i++ != x);
    return i;
}

此行为的实现通常如下所示

struct my_iterator
{
    // ...

    value_type operator * ()
    {
        // return the value that this operator is pointing to
    }

    my_iterator operator ++ (int)
    {
        my_iterator copy = *this;
        // increment *this iterator
        return copy;
    }

    // ...
};

这是可行的,因为调用 operator++(int)i++ 返回先前的迭代器值,然后取消引用,而 i 本身会递增。

要增加取消引用的值,您应该手动指定运算符优先级:

(*i)++;

由于这是 C++ 标准中运算符优先级的定义方式,因此您无法为表达式 *i++ 实现此行为,否则我猜 i 将不再是迭代器。

If you read the link, you'll see that in the table, on the last row, it is said that if you execute *iter++, your implementation should first dereference, and then increment the result

运算顺序与结果无关。该站点并不是说必须按该顺序调用运算符,只是说副作用必须相等。站点上的示例已简化。以下具有等效的副作用,但也具有与调用 *iter++:

时这两个运算符的实际实现相同的操作顺序
const It it_copy = i; // copying the iterator is part of post increment
++i; // increment is called first
value_type value = *it_copy; // dereference second
return value;

结果是一样的。

如果您调用 *iter++,您将无法获得 table 中显示的顺序,但您也不需要。