我正在使用C ++来实现一个方形列表,这是一个双向链表的双向链表。列表是排序的,并且想法是当元素被插入和擦除时,结构保持正方形的形状。如果列表总共有四个元素,则该正方形将为2x2形状。
它看起来像这样:
我已经对链表做了一些研究,并且理解一般的想法是创建包含每个数据元素的节点,以及指向和来自周围元素的指针,但有一件事让我失望就是我会如何(或者可以)实现迭代器来遍历方形列表。
这是我第一次尝试构建数据结构,所以整个过程对我来说都是一个新手。任何提示赞赏!
答案 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)
,--
,const
版const_iterator
等来加强一点。更一般的用法。我通常会将自定义迭代器类作为自定义容器类的一个成员,提供begin()
和end()
来生成自定义迭代器对象,但我不确定您是否&#39;重新计划有一个实际的方形列表&#34;或者只是在任何地方使用list<list<T>>
。