Я должен реализовать этот список, связанный дважды. В списке нужен указатель спереди, указывающий на первый действительный элемент, и обратный указатель, указывающий на последний действительный элемент.Ссылка на двойной список ссылок
Моя проблема с этим кодом является с последними строками, когда я должен реализовать T & назад и определить конец iterator.What я в настоящее время не работаю
#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
Edit: добавлена --operator
Благодарим вас за разъяснения. Я добавил --оператор и снова вернулся к * - end(). Я понимаю, почему m_back + 1 не работает для меня. Но я все еще смущен тем, как закончить работу. – Lin0523
Способ заставить end() работать - это выяснить, как выполнить все требования, которые должны удовлетворять конечное значение итератора. Один общий способ, но не единственный способ - всегда иметь фиктивный узел, расположенный в конце списка, поэтому пустой список содержит только фиктивный узел. Указателем на этот фиктивный узел является ваш итератор end(), и перед ним вставлены все реальные узлы в списке. Или, end() представлен нулевым указателем, но тогда итератор должен также содержать указатель на свой собственный список, чтобы оператор мог работать правильно. Есть много способов сделать это. –