|
edef ptrdiff_t difference_type; typedef typename _Base::allocator_type allocator_type; allocator_type get_allocator() const { return _Base::get_allocator(); } public: typedef _List_iterator<_Tp,_Tp&,_Tp*> iterator; typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator; typedef reverse_bidirectional_iterator
const_reverse_iterator; typedef reverse_bidirectional_iterator
reverse_iterator; protected: using _Base::_M_node; using _Base::_M_put_node; using _Base::_M_get_node; protected: _Node* _M_create_node(const _Tp& __x) ///用特定数据构造结点 { _Node* __p = _M_get_node(); try { _Construct(&__p->_M_data, __x); }catch(...){ _M_put_node(__p); } return __p; } _Node* _M_create_node() ///构造含默认值的结点 { _Node* __p = _M_get_node(); try { _Construct(&__p->_M_data); }catch(...){ _M_put_node(__p); } return __p; } public: explicit list(const allocator_type& __a = allocator_type()) : _Base(__a) {} iterator begin() { ///此处亦必须强制进行指针类型转化,因为iterator类构造函数只接受 ///派生类指针,而_M_node->_M_next为基类指针,不能自动转化 return (_Node*)(_M_node->_M_next); } const_iterator begin() const { return (_Node*)(_M_node->_M_next); } iterator end() { return _M_node; } const_iterator end() const { return _M_node; } reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } bool empty() const { return _M_node->_M_next == _M_node; } size_type size() const { ///list的size函数需要遍历整个list size_type __result = 0; distance(begin(), end(), __result); return __result; } size_type max_size() const { return size_type(-1); } reference front() { return *begin(); } const_reference front() const { return *begin(); } reference back() { return *(--end()); } const_reference back() const { return *(--end()); } ///list的swap函数只需交换各自的头指针 void swap(list<_Tp, _Alloc>& __x) { __STD::swap(_M_node, __x._M_node); } iterator insert(iterator __position, const _Tp& __x) { ///该函数只需生成一个新节点,然后修改相关指针将该节点“链”到合适位置即可 _Node* __tmp = _M_create_node(__x); __tmp->_M_next = __position._M_node; __tmp->_M_prev = __position._M_node->_M_prev; __position._M_node->_M_prev->_M_next = __tmp; __position._M_node->_M_prev = __tmp; return __tmp; } iterator insert(iterator __position) { return insert(__position, _Tp()); } /// Check whether it's an integral type. If so, it's not an iterator. template
void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x, __true_type) { _M_fill_insert(__pos, (size_type) __n, (_Tp) __x); } template
void _M_insert_dispatch(iterator __pos, _InputIterator __first, _InputIterator __last, __false_type); template
void insert(iterator __pos, _InputIterator __first, _InputIterator __last) { typedef typename _Is_integer<_InputIterator>::_Integral _Integral; _M_insert_dispatch(__pos, __first, __last, _Integral()); } void insert(iterator __pos, size_type __n, const _Tp& __x) { _M_fill_insert(__pos, __n, __x); } void _M_fill_insert(iterator __pos, size_type __n, const _Tp& __x); ///在x前插入n个x void push_front(const _Tp& __x) { insert(begin(), __x); } void push_front() {insert(begin());} void push_back(const _Tp& __x) { insert(end(), __x); } void push_back() {insert(end());} iterator erase(iterator __position) { _List_node_base* __next_node = __position._M_node->_M_next; _List_node_base* __prev_node = __position._ |