在C ++ 11中实现自定义迭代器 [英] Implementing custom iterators in C++11

查看:605
本文介绍了在C ++ 11中实现自定义迭代器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在读一本书,因此开始了模板一章。我已经阅读了有关迭代器的章节。为了练习,我尝试使用模板实现一个双向链接的类。下面是我班的头文件。

I am reading a book, and I started the Templates chapter. I have already read the chapter about iterators. For practicing, I am trying to implement a doubly-linked class using templates. Below is the header file of my class.

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();
};

我本可以设置两个成员:

I could have set two members:

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

...起着非常基本的迭代器的作用,但实际上它们不是迭代器。因此,我有一个问题:

...to act like very basic iterators, but they are not iterators actually. So, I have a question:

我如何实现自定义迭代器类以用于所有算术运算并具有 begin() cbegin() end() cend ()

How do I implement the custom iterator class to be used with all the arithmetic operations and to have begin(), cbegin(), end(), and cend()?

(我知道创建列表类的效率不如 std :: list ,但我这样做只是为了练习。)

(I am aware that creating a list class will not be as efficient as std::list, but I am doing this just for sake of practicing.)

推荐答案

如果您查看< iterator> 的实现,您会发现类似 __ normal_iterator 的东西,

If you have a look at an implementation of <iterator>, you'll find something like __normal_iterator, which looks like:

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; }
};

这应该在普通的指针或迭代器上工作。您所要做的只是将其用作模板,并调整自定义容器所需的内容。如果 T 是您的 value_type ,则成员函数通常会返回

This is supposed to work on an ordinary pointer or iterator. All you have to do is use this as a template and adjust to what is needed by your custom container. If T is your value_type, then member functions normally return


  • begin()-> iter< T *>

  • cbegin()-> iter< const T *>

  • rbegin()-> std :: reverse_iterator< iter< T *> >

  • crbegin()-> std :: reverse_iterator< iter< ; const T *> >

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

但是,由于您拥有 node_structure ,这并非完全正确,您需要详细说明。

However, since you have your node_structure, this is not entirely true and you need to elaborate a bit more.

这篇关于在C ++ 11中实现自定义迭代器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆