C++ 如何覆盖*i++;对于c++;自定义迭代器?

C++ 如何覆盖*i++;对于c++;自定义迭代器?,c++,iterator,std,C++,Iterator,Std,这让我很困惑,我正在实现一个自定义迭代器,我在这里读到:“*iter++的行为应该首先使用解引用操作符,然后将返回值(复制的)增加1” 在我的自定义迭代器中,我重写了操作符*和操作符++(intv),问题是当我执行*iter++时,操作符++(intv)在操作符*之前被调用,这是正确的行为,但不是为了我想做的事情(我猜?) 如果您阅读该链接,您将在表的最后一行看到,如果执行*iter++,您的实现应该首先取消引用,然后增加结果,这不是默认行为 我真的不知道该怎么办,有什么想法吗 理解答案后,标题

这让我很困惑,我正在实现一个自定义迭代器,我在这里读到:“
*iter++
的行为应该首先使用解引用操作符,然后将返回值(复制的)增加1”

在我的自定义迭代器中,我重写了
操作符*
操作符++(intv)
,问题是当我执行
*iter++
时,
操作符++(intv)
操作符*
之前被调用,这是正确的行为,但不是为了我想做的事情(我猜?)

如果您阅读该链接,您将在表的最后一行看到,如果执行
*iter++
,您的实现应该首先取消引用,然后增加结果,这不是默认行为

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

理解答案后,标题有误导性,对不起

谢谢


Johan

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

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

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

    template <typename InputIterator, typename T>
    InputIterator drop_until (InputIterator i, T const & x)
    {
        while (*i++ != x);
        return i;
    }
    
    这是可行的,因为调用
    operator++(int)
    i++
    返回上一个迭代器值,然后该迭代器值被取消引用,而
    i
    本身被递增

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

    (*i)++;
    

    因为这是C++标准中定义的操作符优先级,所以不能实现表达式“代码> *I++<代码>,或者<代码> > <代码>将不再是迭代器,我猜。 如果您阅读链接,您将在表中看到,在最后一行,据说如果您执行*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++
    ,则无法获得该表中显示的顺序,但也不需要。

    这是正确的behavior@PaoloM首先,我是C++初学者,所以让我先为这个道歉。正确的行为是什么?我的代码做什么或网站上说什么?正如问题中所述,它们做不同的事情。正确的行为是在调用
    operator*
    之前调用
    operator++
    。这是标准的运算符优先级。是的@PaoloM,问题是如何更改它,很抱歉不清楚。您不能更改运算符优先级,即使可以,也不应该更改。这将导致可怕的误导代码。谢谢你的回答,我开始觉得自己很笨。。。如何实现
    *I++
    提供您列出的行为?我知道我可以在语句中指出运算符的优先级,但我如何将其设为默认值?@JohanS哪个行为?答案开头的那一个?@JohanS
    operator*
    operator++
    显然是两个不同的运算符,因此您无法通过修复
    operator*
    operator++
    的实现来控制
    *i++
    的行为。这些操作的调用者有责任指定他们喜欢的顺序。
    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;