[英]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.