繁体   English   中英

我可以在用户定义的 class 上使用 std::next

[英]Can I use std::next on user defined class

如果我有一个用户定义的 class:

class MyColl {
     int *data ;
     public :
     class Itr {
              int operator*() {}
              void operator++()
              bool operator != (const Itr &oth)
     } ;
     Itr begin() {}
     Itr end() {}
} ;

我可以在MyColl的对象上使用std::next如果是,那么需要做什么

// How to implement a forward iterator for your collection class

template <typename T>
class MyCollection
{
public:

  struct MyCollectionIterator
  {
    // These five typedefs tell other things about your iterator 
    
    using iterator_category = std::forward_iterator_tag;
    using value_type        = T;
    using difference_type   = std::ptrdiff_t;
    using pointer           = T*;
    using reference         = T&;
    
    explicit MyCollectionIterator( ... ) ... {}
    
    // These five methods implement the minimum required behavior of a forward iterator
    
    reference  operator *  () const {...}
    iterator & operator ++ ()       {...}
    iterator   operator ++ (int)    {...}
    
    bool operator == ( iterator that ) {...}
    bool operator != ( iterator that ) {...}
  };
  
  MyCollectionIterator begin() { return MyCollectionIterator(...); }
  MyCollectionIterator end()   { return MyCollectionIterator(...); }
};

除了前向迭代器之外,还有其他迭代器类型。 如果可能,您应该实现最强大的迭代器类型:如果不是随机访问,则双向,如果不是双向,则转发。

在 C++(请参阅此处的文档)中,迭代器越来越令人恐惧,但其基本思想只是一个 class,它知道如何伪装成足以访问集合数据的指针。 为此,它必须提供某些类型的信息和功能。

链接文档中的迭代器类型小表将在向迭代器 class 添加所需功能时为您提供帮助。

我可以在用户定义的 class 上使用 std::next

您可以将std::next与作为迭代器的任何 class 一起使用。

我可以在 MyColl 的对象上使用 std::next 吗

不,因为MyColl不是迭代器。

您也不能将它与MyColl::Itr使用,因为它也不是迭代器。

我错过了一些东西,因为我收到以下错误error: no type named 'difference_type' in 'struct std::iterator_traits<MyColl::Itr>

错误消息会告诉您缺少什么。 您缺少std::iterator_traits<MyColl::Itr>::difference_type 没有它, MyColl::Itr就不是迭代器。 更一般地说,class 必须满足iterator概念的所有要求。

我发现我的Itr class 必须定义以下内容:

using difference_type = std::ptrdiff_t;
using iterator_category = std::forward_iterator_tag;
using value_type = int;
using pointer = value_type*;
using reference = value_type&;

如果我还必须支持std::prev function 那么Itr必须定义前缀运算符 -- 并且iterator_category必须是std::random_access_iterator_tag

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM