Я создал связанный список в C ++ и хочу реализовать для него итератор, чтобы я мог выполнять циклы диапазона: for (const int& i : list)
, где Linked_List<int> list;
.
Моя идея состоит в том, чтобы создать Iterator
как часть класса Linked_List
следующим образом:
Это то, что я получил до сих пор:
template <typename T>
class Linked_List
{
public:
struct Iterator;
struct Node;
public:
Linked_List();
~Linked_List() noexcept(false);
Linked_List(const Linked_List&) = delete;
Linked_List(Linked_List&&) = delete;
Linked_List& operator=(const Linked_List&) = delete;
Linked_List& operator=(Linked_List&&) = delete;
void push_back(T);
void push_front(T);
void pop_back();
void pop_front();
bool empty() const;
T back() const;
T front() const;
//void swap(T, T);
//void insert(Iterator, T);
//void erase(Iterator);
//Iterator begin() const;
//Iterator end() const;
private:
Node* head;
Node* tail;
};
template<typename T>
struct Linked_List<T>::Node
{
Node() : prev(nullptr), next(nullptr) {}
Node(T t) : value(t), prev(nullptr), next(nullptr) {}
Node* prev;
Node* next;
T value;
};
- Это хороший подход?
- Должен ли я делать проверку ошибок при увеличении списка, чтобы проверить, если
current->next == tail
? Если да, то как мне это сделать? Потому что у моего Итератора нет объекта списка с хвостом.
Редактировать :
Я не уверен, как реализовать struct Iterator;
, я застреваю, когда выясняю, как связать его со списком, чтобы я мог проверить, равен ли текущий узел, возвращенный из итератора, хвосту в списке, в Linked_List Iterator end() const
метод.
Допустим, я реализовал все необходимые операторы для итератора следующим образом:
struct Iterator
{
T& operator*() const { return current->value; }
bool operator!=(const Iterator& rhs) { return (*_current != rhs._current); }
Iterator& operator++()
{
current = current->next;
return *this;
}
};
Как мне теперь реализовать Iterator Linked_List<T>::begin() const;
и end()
?
Я представляю себе воображаемого пользователя, который делает объект итератора следующим образом:
Linked_List<int>::Iterator it;
Идея состоит в том, чтобы иметь открытый конструктор без параметров и закрытый конструктор, который принимает узел в качестве параметра, для которого будет установлен _current
, и иметь класс Linked_List
в качестве друга.