如何覆盖* i ++ for c ++ custom iterator?

时间:2015-09-22 15:56:05

标签: c++ iterator std

这让我很困惑,我实现了一个自定义迭代器,我在这里阅读:http://en.cppreference.com/w/cpp/concept/InputIterator*iter++的行为应该首先使用dereference运算符,然后增加返回值(复制),由1开始。

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

如果你阅读了这个链接,你会在表格的最后一行看到,如果你执行*iter++,你的实现应首先取消引用,然后递增结果,这不是什么是默认行为。

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

在理解答案后,标题会产生误导,抱歉!

谢谢,

约翰

2 个答案:

答案 0 :(得分:1)

从您提供的链接中,*i++相当于:

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

即,

  1. 取消引用迭代器i并将其存储在x
  2. 增加迭代器
  3. 在递增迭代器之前,返回通过解除引用获得的值x
  4. 这可以在接受输入迭代器的模板代码中使用,如下所示:

    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;
        }
    
        // ...
    };
    

    这是有效的,因为调用i++的{​​{1}}返回先前的迭代器值,然后取消引用,而operator++(int)本身会增加。

    要增加解除引用的值,您应手动指示运算符优先级:

    i

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

答案 1 :(得分:1)

  

如果您阅读了该链接,您会在表格中看到最后一行,如果您执行* iter ++,您的实现应首先取消引用,然后递增结果

操作的顺序与结果无关。该网站并未说必须按顺序调用运算符,只是副作用必须相同。网站上的示例已简化。以下具有相同的副作用,但也具有与调用*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++但是您也不需要,则无法获得该表中显示的订单。