如何为 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)
即
- 取消引用迭代器
i
并将其存储在 x
中
- 增加迭代器
- 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 中显示的顺序,但您也不需要。
这让我很困惑,我正在实现一个自定义迭代器,我在这里读到: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)
即
- 取消引用迭代器
i
并将其存储在x
中
- 增加迭代器
- 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 中显示的顺序,但您也不需要。