我可以在用户定义的 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。
如果我有一个用户定义的 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。