私はこの二重リンクリストを実装する必要があります。リストには、最初の有効な要素を指すフロントポインタと、最後の有効な要素を指すバックポインタが必要です。二重リンクリストバックポインタ
私はT &バックを実装し、私は現在
#ifndef List_dllist_h
#define List_dllist_h
#include <iterator>
template <class T>
class DList
{
struct Node
{
Node(const T& x,Node* y = 0):m_data(x),m_next(y),m_prev(y){}
T m_data;
Node* m_next;
Node* m_prev;
};
Node* m_head;
Node* m_back;
public:
class iterator
{
Node* m_rep;
public:
friend class DList;
inline iterator(Node* x=0):m_rep(x){}
inline iterator(const iterator& x):m_rep(x.m_rep) {}
inline iterator& operator=(const iterator& x)
{
m_rep=x.m_rep; return *this;
}
inline iterator& operator++()
{
m_rep = m_rep->m_next; return *this;
}
inline iterator operator++(int)
{
iterator tmp(*this); m_rep = m_rep->m_next; return tmp;
}
inline iterator& operator--()
{
m_rep= m_rep->m_prev; return *this;
}
inline iterator operator--(int)
{
iterator tmp(*this); m_rep= m_rep->m_prev; return tmp;
}
inline T& operator*() const { return m_rep->m_data; }
inline Node* operator->() const { return m_rep; }
inline bool operator==(const iterator& x) const
{
return m_rep == x.m_rep;
}
inline bool operator!=(const iterator& x) const
{
return m_rep != x.m_rep;
}
};
DList() : m_head(0), m_back(0) {}
~DList() { clear(); }
inline T& front() { return *begin(); }
inline const T& front() const { return *begin(); }
inline T& back() { return *--end(); }
inline const T& back() const { return *--end(); }
inline iterator begin() { return iterator(m_head); }
inline iterator end() { return iterator(m_back); }
};
#endif
編集機能していないしているiterator.What終わりを定義する必要がある場合、このコードで私の問題は、最後の数行である:追加--operator
を
ありがとうございます。私は--operatorを追加し、* - end()に戻しました。私はなぜm_back + 1が私のために働いていないのか理解しています。しかし、私は仕事を終わらせる方法についてはまだ混乱しています。 – Lin0523
end()を動作させる方法は、終了イテレータ値が満たさなければならないすべての要件を満たす方法を理解することです。一般的な方法の1つですが、唯一の方法ではなく、ダミーノードをリストの最後に置くことです。空のリストにはダミーノードだけが含まれます。そのダミーノードへのポインタはend()イテレータであり、リスト内のすべての実ノードはその前に挿入されます。あるいは、end()をヌルポインタで表現しても、イテレータはoperator - が正常に動作するように、自身のリストへのポインタも含まなければなりません。それを行うには多くの方法があります。 –