#ifndef _M_LIST_H #define _M_LIST_H /*************************************** * Description:list实现 * Create:2019/12/1 * Author:zhangfeng * History: * 2019-12-3 搭建初步框架和基本接口 * node是循环连接,end->next连接front, front-prev连接end * 2019-12-4 补齐构造函数,模板继承类不能调用基类成员,必须显示调用 * 2019-12-5 补齐修改器部分,list交换只需要替换_node * 2019-12-6 补齐操作相关 * *************************************/ #include <memory> #include <iostream> #include <algorithm> #include <cstddef> #include <type_traits> //节点 template <class T> struct List_node { T _data; List_node* _next; List_node* _prev; List_node(T x) : _data(x){} }; //迭代器 template <class T, class Ref, class Ptr> struct List_iterator { typedef List_iterator<T, T&, T*> iterator; typedef List_iterator<T, const T&, const T*> const_iterator; typedef List_iterator<T, Ref, Ptr> _Self; typedef T value_type; typedef Ptr pointer; typedef Ref reference; typedef List_node<T> Node; Node* _node; List_iterator(Node *_x) : _node(_x) {} reference operator*() const { return _node->_data; } bool operator==(const iterator& rhs) const { return _node == rhs._node; } bool operator==(const const_iterator& rhs) const { return _node == rhs._node; } bool operator!=(const iterator& rhs) const { return _node != rhs._node; } bool operator!=(const const_iterator& rhs) const { return _node != rhs._node; } void incr() { _node = _node->_next; } void decr() { _node = _node->_prev; } //++it 前缀 _Self& operator++() { this->incr(); return *this; } //it++ 后缀 _Self operator++(int) { _Self tmp = *this; this->incr(); return tmp; } //--it 前缀 _Self& operator--() { this->decr(); return *this; } //it-- 后缀 _Self operator--(int) { _Self tmp = *this; this->decr(); return tmp; } }; template <class T, class Alloc > class mList_base { public: typedef List_node<T> Node; mList_base() { std::cout << "base mList" << std::endl; _node = _alloc.allocate(1); _node->_next = _node; _node->_prev = _node; } ~mList_base() { std::cout << "~ base mList" << std::endl; clear(); _alloc.deallocate(_node, 1); } Node* create_node(const T& _x){ Node* p = this->_alloc.allocate(1); try{ _alloc.construct(p, _x); }catch(...){ _alloc.deallocate(p, 1); } return p; } void clear() { Node* _cur = (Node*)_node->_next; while(_cur != _node) { Node* _tmp = _cur; _cur = (Node*)_cur->_next; _alloc.destroy(&_tmp->_data); _alloc.deallocate(_tmp, 1); } _node->_next = _node; _node->_prev = _node; } protected: Node* _node; Alloc _alloc; }; template <class T, class Alloc=std::allocator<List_node<T>>> class mList : protected mList_base<T, Alloc> { public: typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef List_node<T> Node; typedef mList_base<T, Alloc> _Base; public: typedef List_iterator<T, T&, T*> iterator; typedef List_iterator<T, const T&, const T*> const_iterator; protected: using _Base::_node; using _Base::_alloc; public: explicit mList() { } explicit mList( size_type _n, const T& _value ) { std::cout << " mList( size_type _n, const T& _value ) " << std::endl; this->insert(begin(), _n, _value); } mList( const mList& other ) { std::cout << " mList( const mList& other ) " << std::endl; this->insert(begin(), other.begin(), other.end()); } ~mList() { std::cout << "~mList" << std::endl; } //元素访问 iterator begin() { return (Node*)_node->_next; } const_iterator begin() const { return (Node*)_node->_next; } iterator end() { return _node; } const_iterator end() const { return _node; } reference front() { return *begin(); } const_reference front() const { return *begin(); } reference back() { return *(--end()); } const_reference back() const { return *(--end()); } //容量 bool empty() const { return _node->_next == _node; } size_type size() const { size_type result = 0; std::distance(begin(), end(), result); return result; } size_type max_size() const { return size_type(-1); } //修改器 void clear() { _Base::clear(); } void push_back( const T& _x ) { insert(end(), _x); } void push_front( const T& _x ) { insert(begin(), _x); } iterator insert(iterator _pos, const T& _x); void insert(iterator _pos, size_type _n, const T& _x); void insert( iterator _pos, const_iterator _first, const_iterator _last); iterator erase(iterator _pos); iterator erase( iterator _first, iterator _last ); void swap(mList& other) { std::swap(_node, other._node); } //操作 void merge( mList& other ); void splice( iterator _pos, mList& other ) { if(!other.empty()) { this->transfer(_pos, other.begin(), other.end()); } } void remove( const T& value); void reverse(); void unique(); void sort(); protected: void transfer(iterator _pos, iterator _first, iterator _last) { if( _pos != _last ) { // [_first, _last] 从原位置移除 _last._node->_prev->_next = _pos._node; _first._node->_prev->_next = _last._node; _pos._node->_prev->_next = _first._node; // Splice [first, last) into its new position. Node* _tmp = _pos._node->_prev; _pos._node->_prev = _last._node->_prev; _last._node->_prev = _first._node->_prev; _first._node->_prev = _tmp; } } }; template <class T, class Alloc> typename mList<T, Alloc>::iterator mList<T, Alloc>::insert(iterator _pos, const T& _x) { Node* tmp = _Base::create_node(_x); tmp->_next = _pos._node; tmp->_prev = _pos._node->_prev; _pos._node->_prev->_next = tmp; _pos._node->_prev = tmp; return tmp; } template <class T, class Alloc> void mList<T, Alloc>::insert(iterator _pos, size_type _n, const T& _x) { for(; _n > 0; --_n) { insert(_pos, _x); } } template <class T, class Alloc> void mList<T, Alloc>::insert( iterator _pos, const_iterator _first, const_iterator _last) { for(; _first != _last; ++_first) { insert(_pos, *_first); } } template <class T, class Alloc> typename mList<T, Alloc>::iterator mList<T, Alloc>::erase(iterator _pos) { Node* _next_node = _pos._node->_next; Node* _prev_node = _pos._node->_prev; _next_node->_prev = _prev_node; _prev_node->_next = _next_node; _alloc.destroy(&_pos._node->_data); _alloc.deallocate(_pos._node, 1); return iterator((Node*)_next_node); } template <class T, class Alloc> typename mList<T, Alloc>::iterator mList<T, Alloc>::erase( iterator _first, iterator _last ) { while (_first != _last) { erase(_first++); } return _last; } template <class T, class Alloc> void mList<T, Alloc>::merge( mList& other) { iterator _first1 = begin(); iterator _last1 = end(); iterator _first2 = other.begin(); iterator _last2 = other.end(); while (_first1 != _last1 && _first2 != _last2) { if ( *_first2 < *_first1 ) { iterator _next = _first2; transfer(_first1, _first2, ++_next); _first2 = _next; } else { ++_first1; } } if(_first2 != _last2) transfer(_last1, _first2, _last2); } template <class T, class Alloc> void mList<T, Alloc>::remove( const T& value) { iterator _first = begin(); iterator _last = end(); while ( _first != _last) { iterator _next = _first; ++_next; if( *_first == value ) erase(_first); _first = _next; } } template <class T, class Alloc> void mList<T, Alloc>::reverse() { Node* _tmp = _node; do { std::swap(_tmp->_next, _tmp->_prev); _tmp = _tmp->_prev; // Old next node is now prev. std::cout << std::endl; } while (_tmp != _node); } template <class T, class Alloc> void mList<T, Alloc>::unique() { iterator _first = begin(); while(_first != end()) { iterator _tmp = _first++; if( *_tmp == *(_first) ) { erase(_tmp); } } } template <class T, class Alloc> void mList<T, Alloc>::sort() { std::sort(begin(), end()); } #endif