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哪个行为?答案开头的那一个?@JohanSoperator*
和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;