我可以在用户定义的 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 如果是,那么需要做什么

Can I use std::next on user defined class

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

Can I use std::next on objects of MyColl

不,因为 MyColl 不是迭代器。

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

I am missing something because I am getting following error 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 函数,那么 Itr 必须定义前缀运算符 -- 并且 iterator_category 必须是 std::random_access_iterator_tag

// 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++ 中越来越令人恐惧 (see docs here),但其基本思想只是一个 class 知道如何伪装成足以访问您的指针的指针集合的数据。为此,它必须提供某些类型的信息和功能。

链接文档中的少量 table 迭代器类型将帮助您向迭代器添加所需的功能 class。