在c++ 11中实现自定义迭代器

Implementing custom iterators in C++11

本文关键字:自定义 迭代器 实现 c++      更新时间:2023-10-16

我在读一本书,我从模板章节开始。我已经读过关于迭代器的那一章。为了练习,我试图使用模板实现双链接类。下面是我的类的头文件。

template<typename T>
class list
{
private:
    T* first_node;
    T* last_node;
    struct node_structure
    {
        T* previous;
        T* next;
        T content;
    };
public:
    list();
    void push_back( T& item );
    void push_front( T& item );
    void remove( size_t index );
    size_t size() const;
    T& get_node( size_t index );
    void clear();
    ~list();
};

可以设置两个成员:

T* begin();
T* end();

…像非常基本的迭代器一样,但它们实际上不是迭代器。所以,我有一个问题:

如何实现用于所有算术运算的自定义迭代器类并拥有begin(), cbegin(), end()cend() ?

(我知道创建list类不会像std::list那样高效,但我这样做只是为了练习)

如果你看一下<iterator>的实现,你会发现类似__normal_iterator的东西,它看起来像:

template<typename I>
class iter
{
protected:
    I i;
    using tr = iterator_traits<I>;
public:
    using iterator_type     = I;
    using iterator_category = typename tr::iterator_category;
    using value_type        = typename tr::value_type;
    using difference_type   = typename tr::difference_type;
    using reference         = typename tr::reference;
    using pointer           = typename tr::pointer;
    iter() : i(I()) { }
    explicit iter(const I& i) : i(i) { }
    // Forward iterator requirements
    reference operator*() const { return *i; }
    pointer operator->() const { return i; }
    iter& operator++() { ++i; return *this; }
    iter operator++(int) { return iter(i++); }
    // Bidirectional iterator requirements
    iter& operator--() { --i; return *this; }
    iter operator--(int) { return iter(i--); }
    // Random access iterator requirements
    reference operator[](const difference_type& n) const { return i[n]; }
    iter& operator+=(const difference_type& n) { i += n; return *this; }
    iter operator+(const difference_type& n) const { return iter(i + n); }
    iter& operator-=(const difference_type& n) { i -= n; return *this; }
    iter operator-(const difference_type& n) const { return iter(i - n); }
    const I& base() const { return i; }
};

应该在普通指针或迭代器上工作。您所要做的就是将其用作模板,并根据自定义容器的需要进行调整。如果Tvalue_type,那么成员函数通常返回

  • begin() -> iter<T*>
  • cbegin() -> iter<const T*>
  • rbegin() -> std::reverse_iterator<iter<T*> >
  • crbegin() -> std::reverse_iterator<iter<const T*> >

但是,由于您有自己的node_structure,这并不完全正确,您需要详细说明。