我已经在 C++ 中创建了一个链接列表,并想为其实现一个迭代器,以便我可以执行范围循环:for (const int& i : list)
where 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
?如果是这样,我该怎么做?因为我的迭代器没有带尾部的列表对象。
Edit:
我不确定如何实施struct Iterator;
,当我弄清楚如何将它与列表连接以便我可以检查从迭代器返回的当前节点是否等于 Linked_List 中列表中的尾部时,我陷入了困境Iterator end() const
method.
假设我已经为迭代器实现了所有必需的运算符,如下所示:
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;
and end()
now?
我想象一个假想的用户创建一个这样的迭代器对象:Linked_List<int>::Iterator it;
一个想法是有一个不带参数的公共构造函数和一个将节点作为参数的私有构造函数_current
将被设置为,并且有Linked_List
作为朋友上课。