gpt4 book ai didi

c++ - 如何为 C++ 自定义迭代器覆盖 *i++?

转载 作者:行者123 更新时间:2023-11-28 02:20:26 24 4
gpt4 key购买 nike

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

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

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

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

理解后回答,标题误导,抱歉!

谢谢,

约翰

最佳答案

根据您提供的链接,*i++ 等同于:

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

也就是说,

  1. 解引用迭代器 i 并将其存储在 x
  2. 增加迭代器
  3. 返回 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 将不再是迭代器,我猜猜。

关于c++ - 如何为 C++ 自定义迭代器覆盖 *i++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com