如何实现'square list'迭代器

时间:2014-02-12 02:29:28

标签: c++ list linked-list

我正在使用C ++来实现一个方形列表,这是一个双向链表的双向链表。列表是排序的,并且想法是当元素被插入和擦除时,结构保持正方形的形状。如果列表总共有四个元素,则该正方形将为2x2形状。

它看起来像这样:

enter image description here

我已经对链表做了一些研究,并且理解一般的想法是创建包含每个数据元素的节点,以及指向和来自周围元素的指针,但有一件事让我失望就是我会如何(或者可以)实现迭代器来遍历方形列表。

这是我第一次尝试构建数据结构,所以整个过程对我来说都是一个新手。任何提示赞赏!

1 个答案:

答案 0 :(得分:1)

您需要做出一些设计决策,例如,如果整个迭代耗尽每个内部"内部"依次列出,或者应该返回所有内部列表的第一个元素,然后是第二个等等。

尝试如何实现这个:

#include <iostream>
#include <list>

template <typename T>
struct Iterator
{
    typedef typename std::list<std::list<T> >::iterator outer_iterator;
    typedef typename std::list<T>::iterator inner_iterator;

    outer_iterator outer_;
    bool inner_initialised_;
    inner_iterator inner_;

    Iterator(outer_iterator begin)
      : outer_(begin), inner_initialised_(false)
    { }

    T& operator*()
    {
        if (!inner_initialised_)
        {
            inner_ = outer_->begin();
            inner_initialised_ = true;
        }
        return *inner_;
    }

    T& operator->() { return operator*(); }

    Iterator& operator++()
    {
        if (++inner_ == outer_->end())
        {
            ++outer_;
            inner_initialised_ = false;
        }
        return *this;
    }

    bool operator!=(outer_iterator i) const { return outer_ != i; }
};

int main()
{
    std::list<std::list<int>> lli;
    std::list<int> li;
    li.push_back(42);
    li.push_back(13);
    lli.push_back(li);
    li.push_back(999);
    lli.push_back(li);
    for (Iterator<int> i = lli.begin(); i != lli.end(); ++i)
        std::cout << *i << ' ';
    std::cout << '\n';
}

输出:

42 13 42 13 999

注意bool inner_initialised_变量 - 它确保不会尝试在等于->begin()的外迭代器值上调用end()

您可能希望通过operator==++(int)--constconst_iterator等来加强一点。更一般的用法。我通常会将自定义迭代器类作为自定义容器类的一个成员,提供begin()end()来生成自定义迭代器对象,但我不确定您是否&#39;重新计划有一个实际的方形列表&#34;或者只是在任何地方使用list<list<T>>