1.成员变量

上一节已知信息 list是带哨兵卫的双向链表链表 ,所以list类成员变量应该有 节点以及节点个数信息

private://定义哨兵位Node* _head;//记录插入节点个数size_t _size; 

2.节点类

每个节点应包含指向下一节点指针、上一节点指针以及自身数据的信息

template//节点最好用struct定义 保证对外是共有 避免class默认私有 的麻烦struct list_node{list_node* _next;list_node* _prev;T _val;//构造函数list_node(const T& val = T()):_next(nullptr), _prev(nullptr), _val(val){}};

3.迭代器封装类

3.1类型重定义,定义节点

//定义类模板 Ref迭代器返回的类型。 Ptr指针指向template// 迭代器封装的类struct __list_iterator{typedef list_node Node;//c++中可以这么使用,在内部引用自身类型 (别名)typedef __list_iterator  self;Node* _node;

3.2构造函数

//构造函数__list_iterator(Node* node):_node(node){}

3.3 operator*()

//Ref代表返回值的类型 在我们这里 可以是T& 也可以是 const T&Ref operator*(){return _node->_val;}

3.4operator->()

//Ptr代表返回值的类型,在这里可以是T*Ptr operator->(){return &_node->_val;}

3.5operator++()

self& operator++(){_node = _node->_next;return *this;}

3.6operator++(int)

//后置++,返回值 因为tmp是临时变量self operator++ (int){self tmp(*this);_node = _node->_next;return tmp;}

3.7operator–()

//前置--self& operator--(){_node = _node->_prev;return *this;}

3.8operator++(int)

//后置--self operator--(int){self tmp(*this);_node = _node->_prev;return tmp;}

3.9比较

//比较bool operator!= (const self& it) const //传的对象是const{return _node != it._node;}bool operator== (const self& it) const //{return _node == it._node;}

4.list类

4.1类型重定义

templateclass list{typedef list_node Node;public:typedef __list_iterator iterator;typedef __list_iterator const_iterator;

4.2成员函数

4.2.1构造函数

list(){empty_init();}

4.2.2 初始化函数

void empty_init()// {_head = new Node;_head->_prev = _head;_head->_next = _head;_size = 0; }

4.2.3拷贝构造函数

list(const list& lt)// 拷贝构造{empty_init();for (auto& e : lt){push_back(e);}}

4.2.4交换函数

//交换void swap(const list& lt){std:swap(_head, lt._head);std:swap(_size, lt._size);}list& operator= (list lt){swap(lt);return *this;}

4.2.5析构函数

~list(){clear();delete _head;_head = nullptr;}

4.2.6清除函数

void clear(){iterator it = begin();while(it != end()){it = erase(it);}_size = 0;}

4.2.7插入insert

//插入iterator insert(iterator pos, const T& x){Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(x);prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;++_size;return newnode;}

4.2.8 擦除erase

iterator erase(iterator pos){assert(pos != end());Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;--_size;//返回删除节点的下个位置return next;}

4.2.9 push_back()

void push_back(const T& x){insert(end(), x);}

4.2.10push_front()

void push_front(const T& x){insert(begin(), x);}

4.2.11pop_front()

void pop_front(){erase(begin());}size_t size(){return _size;}

4.2.12 pop_back()

void pop_back(){erase(--end());//end()前一个位置}

5测试函数

void test_list1(){listlt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list::iterator it = lt.begin();while (it != lt.end()){(*it) += 1;std::cout << *it << " ";++it;}std::cout << std::endl;//范围for是傻瓜式替代方式for (auto e : lt){std::cout << e << " ";}std::cout << std::endl;Print(lt);}struct A{A(int a1 = 0, int a2 = 0):_a1(a1), _a2(a2){};int _a1;int _a2;};void test2_list2(){list lt;lt.push_back(A(1, 1));lt.push_back(A(2, 2));lt.push_back(A(3, 3));lt.push_back(A(4, 4));list ::iterator it = lt.begin();while(it != lt.end()){//对it解引用 得到是结构体对象std::cout << (*it)._a1 << " " << (*it)._a2 < -> 编译器直接省略成一个std::cout <_a1 << " " <_a2 << std::endl;++it;}std::cout << std::endl;}