【问题标题】:Implementing a list iterator and operators: -- ++ *实现一个列表迭代器和操作符: -- ++ *
【发布时间】:2015-04-15 00:21:24
【问题描述】:

接着这个问题:std::list implementation & pointer arithemetic.

我想实现一个列表迭代器,它可以与其他常见的容器类型及其各自的迭代器互换,所以我想使用诸如:--、++、* 之类的运算符并且能够正常声明迭代器,所以: list::iterator iter = list.begin();

--, ++ 运算符现在可以正常工作,但我遇到了取消引用迭代器的问题,因为结构不能返回值:T iterator::operator*()

template <class T> 
struct element {

  element<T> *prev = NULL;
  element<T> *next = NULL;
  T data;       
};


template <typename T>
class list {

public:

    list::list();

    element<T>* current;

    struct iterator{

        element<T>* iterator::operator++(){ 

           this = *this->next; ..whatever it works          
        }
        element<T>* iterator::operator--()
        T iterator::operator*()
   }    
};

【问题讨论】:

  • 你会希望operator*返回一个reference,或者像*i = 0这样的代码会尝试分配一个临时副本。
  • 好吧,你不要重载后缀增加/减少运算符,只是前缀。我很惊讶它们运行良好,因为如果它们如您在代码 sn-p 中显示的那样使用它们可能会导致未定义的行为。 (提示:他们不应该返回东西吗)?
  • 您是否遇到特定错误? “结构不能返回值”不清楚,我认为这就是人们只是指出任意错误的原因。
  • 另外,我认为这里的主要问题是你处理 pointers 到迭代器,但你应该处理迭代器的 values,即实际迭代器实例。
  • 只是为了澄清一件事; NO 限制了函数可以返回什么,因为它是结构的一部分。如果常规函数或类函数可以返回它,那么结构体就很好。

标签: c++ list iterator operators dereference


【解决方案1】:

迭代器可能看起来像这样:
(在列表模板中声明)

    struct iterator;
    struct const_iterator : public std::iterator<std::bidirectional_iterator_tag, const T>
    {
        const_iterator() = default;
        T operator*() { return itm->data; }
        const T* operator->() { return &(itm->data); }
        const_iterator operator++() { itm = itm->next; return *this; }
        const_iterator operator--() { itm = itm->prev; return *this; }
        const_iterator operator++(int) { const_iterator ret=*this; itm = itm->next; return ret; }
        const_iterator operator--(int) { const_iterator ret=*this; itm = itm->prev; return ret; }
        bool operator==(const_iterator oth) const { return itm==oth.itm; }
        bool operator!=(const_iterator oth) const { return itm!=oth.itm; }
    private:
        element<T>* itm = nullptr;
        const_iterator(element<T>* i) : itm(i) {}
    friend
        class list;
    friend
        struct iterator;
    };
    struct iterator : public std::iterator<std::bidirectional_iterator_tag, T>
    {
        iterator() = default;
        T& operator*() { return itm->data; }
        T* operator->() { return &(itm->data); }
        iterator operator++() { itm = itm->next; return *this; }
        iterator operator--() { itm = itm->prev; return *this; }
        iterator operator++(int) { iterator ret=*this; itm = itm->next; return ret; }
        iterator operator--(int) { iterator ret=*this; itm = itm->prev; return ret; }
        bool operator==(iterator oth) const { return itm==oth.itm; }
        bool operator!=(iterator oth) const { return itm!=oth.itm; }
        operator const_iterator() { return {itm}; }
    private:
        element<T>* itm = nullptr;
        iterator(element<T>* i) : itm(i) {}
    friend
        class list;
    };

    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

这需要

#include <iterator>

编译

【讨论】:

猜你喜欢
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多