这让我很困惑,我实现了一个自定义迭代器,我在这里阅读:http://en.cppreference.com/w/cpp/concept/InputIterator,*iter++
的行为应该首先使用dereference运算符,然后增加返回值(复制),由1开始。
我的自定义迭代器覆盖operator*
和operator++(int v)
,问题是operator++(int v)
在执行operator*
之前调用*iter++
,是正确的行为,但不适合我想做的事(我猜?)。
如果你阅读了这个链接,你会在表格的最后一行看到,如果你执行*iter++
,你的实现应首先取消引用,然后递增结果,这不是什么是默认行为。
我似乎真的不知道该做什么,有什么想法吗?
在理解答案后,标题会产生误导,抱歉!
谢谢,
约翰
答案 0 :(得分:1)
从您提供的链接中,*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;
}
此行为的实现通常类似于
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++
但是您也不需要,则无法获得该表中显示的订单。