一、本篇接口实现包括
list内typedef包括:
typedef __list_node<T> node;
typedef Iterator<T, T&, T*> iterator;
typedef Iterator<T, const T&, const T*> const_iterator;
typedef Reverse_iterator<iterator> reverse_iterator;
typedef Reverse_iterator<const_iterator> const_reverse_iterator;
函数接口包括:
void empty_init()
list()
template<class InputIteartor>
list(InputIteartor first, InputIteartor last)
void push_back(const T& x)
list(const list<T>& t)//传统写法
list(const list<T>& t)//现代写法
list<T>& operator=(const list<T>& t)//传统写法
list<T>& operator=(list<T> t)//现代写法
void swap(list<T>& t)
void push_front(const T& x)
iterator insert(iterator pos ,const T& x)
void pop_back()
void pop_front()
void clear()
~list()
iterator erase(iterator pos)
iterator begin()
iterator end()
const_iterator begin()const
const_iterator end()const
reverse_iterator rbegin()
reverse_iterator rend()
const_reverse_iterator rbegin()const
const_reverse_iterator rend()const
二、接口全实现
https://gitee.com/zxlfx/c-code-warehouse/tree/master/2022_7_21/2022_7_21
三、正向、反向迭代器
有了前面的string、vector的模拟实现,list的模拟并不困难,如同实现一个双链表。本章的重点在于正向和反向的迭代器是怎么实现的?
3.1正向迭代器
这里的正向迭代器并不像string和vector一样是一个原生指针,因为list的节点不是连续的,原生指针无法做到,因此需要写一个封装了众多重载运算符的结构类型。
第一个版本的正向迭代器是以下这种样子
template<class T> struct Iterator { public: typedef __list_node<T> node; typedef Iterator<T> sef; Iterator(node* node = nullptr) { cur = node; } T& operator*() { return cur->val; } T* operator->() { return &cur->val; } sef