C ++链接列表迭代器类

时间:2014-09-29 02:34:57

标签: c++ list iterator

我为项目创建了一个单独的链接列表,现在需要创建一个自定义的Iterator类。我的链表中有一个嵌套类来定义我的迭代器。我已经编写了大部分类,但对于如何实现某些功能感到困惑。我的问题如下:

- 请看我的end()函数。我将它设置为Iterator类的默认构造函数,所以 我想,迭代器中的currentNode变量默认为NULL。这是否正确实施?

- 如何重载 - > Iterator类中的运算符?

class SSLL_Iter : public std::iterator<std::forward_iterator_tag, T>
    {
    public:
        typedef T value_type;
        typedef std::ptrdiff_t difference_type;
        typedef T& reference;
        typedef T* pointer;
        typedef std::forward_iterator_tag iterator_category;
        typedef SSLL_Iter self_type;
        typedef SSLL_Iter& self_reference;

    private:
        Node* currentNode;

    public:
        explicit SSLL_Iter( Node* start = NULL) : currentNode( start ) {}   //****************complete

        SSLL_Iter( const SSLL_Iter& src ) : currentNode( src.currentNode ) {}      //****************complete

        reference operator*() const {   //****************complete
            T& temp = (currentNode->data);
            return temp;
        }

        pointer operator->() const {}  //*******??????????????????

        self_reference operator=( const SSLL_Iter& src ) {     //****************complete

            this->here = src.here;
            return *this;
        }

        self_reference operator++() { // preincrement         //****************complete
            currentNode = currentNode->next;
            return *this;
        }
        self_type operator++(int) {  // postincrement         //****************complete
            self_type temp = (*this);
            ++(*this);
            return temp;
        }

        bool operator==(const SSLL_Iter& rhs) const {        //****************complete
            return (this->currentNode == rhs.currentNode);
        }

        bool operator!=(const SSLL_Iter& rhs) const {        //****************complete
            return (this->currentNode != rhs.currentNode);
        }
    }; // end SSLL_Iter

    typedef std::size_t size_t;
    typedef T value_type;
    typedef SSLL_Iter iterator;
    //typedef Const_SSL_Iter const_iterator;

    SSLL() {}

    SSLL(const SSLL& src ) {

        for(int i = 0; i < src.size(); ++i) {    // populate this SSLL with copies of the other SSLL's    contents
            this->push_back(src.item_at(i));
        }
    }

    ~SSLL() {

        if(!is_empty()) {
            clear();
        }

    }

    iterator begin() { return SSLL_Iter( head ); }

    iterator end() { return SSLL_Iter(); }

1 个答案:

答案 0 :(得分:0)

return &*(*this);是一个体面的operator->

您的SSLL类可能没有效率at,因此请勿在复制构造函数中使用它。相反,请创建SSLL template<class Iterator> void append(Iterator s, Iterator f),并根据其实施SSLL(const SSLL& src)

如果您支持C ++ 11,请考虑使用next替换Node的{​​{1}}节点。对std::unique_ptr<Node>根目录中的指针Node执行相同操作。现在几乎可以自动处理内存管理。在更改后,您的迭代器中可能需要SSLL。这也消除了析构函数的主体,使你的move-constructor .get()正确(除非你在计算节点),等等。