|
__n, __x); } ///在__pos之后插入[__first,__last)之间的值 template
void _M_insert_after_range(_Node_base* __pos, _InIter __first, _InIter __last, __false_type) { while (__first != __last) { __pos = __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } } public: iterator insert_after(iterator __pos, const value_type& __x) { return iterator(_M_insert_after(__pos._M_node, __x)); } iterator insert_after(iterator __pos) { return insert_after(__pos, value_type()); } void insert_after(iterator __pos, size_type __n, const value_type& __x) { _M_insert_after_fill(__pos._M_node, __n, __x); } /// We don't need any dispatching tricks here, because _M_insert_after_range /// already does them. template
void insert_after(iterator __pos, _InIter __first, _InIter __last) { _M_insert_after_range(__pos._M_node, __first, __last); } ///由于slist是单向链表,因此多采用insert_after来实现插入 ///提供的insert函数也实现找到插入位置的前驱结点,然后调用insert_after来实现的 iterator insert(iterator __pos, const value_type& __x) { return iterator(_M_insert_after(__slist_previous(&this->_M_head, __pos._M_node), __x)); } iterator insert(iterator __pos) { return iterator(_M_insert_after(__slist_previous(&this->_M_head, __pos._M_node), value_type())); } void insert(iterator __pos, size_type __n, const value_type& __x) { _M_insert_after_fill(__slist_previous(&this->_M_head, __pos._M_node), __n, __x); } /// We don't need any dispatching tricks here, because _M_insert_after_range /// already does them. template
void insert(iterator __pos, _InIter __first, _InIter __last) { _M_insert_after_range(__slist_previous(&this->_M_head, __pos._M_node), __first, __last); } public: iterator erase_after(iterator __pos) { return iterator((_Node*) this->_M_erase_after(__pos._M_node)); } iterator erase_after(iterator __before_first, iterator __last) { return iterator((_Node*) this->_M_erase_after(__before_first._M_node, __last._M_node)); } ///由于slist是单向链表,因此多采用erase_after来实现删除 ///提供的erase函数也实现找到删除位置的前驱结点,然后调用erase_after来实现的 iterator erase(iterator __pos) { return (_Node*) this->_M_erase_after(__slist_previous(&this->_M_head, __pos._M_node)); } iterator erase(iterator __first, iterator __last) { return (_Node*) this->_M_erase_after( __slist_previous(&this->_M_head, __first._M_node), __last._M_node); } void resize(size_type new_size, const _Tp& __x); void resize(size_type new_size) { resize(new_size, _Tp()); } void clear() { this->_M_erase_after(&this->_M_head, 0); } public: /// Moves the range (__before_first, __before_last ] to *this, /// inserting it immediately after __pos. This is constant time. void splice_after(iterator __pos, iterator __before_first, iterator __before_last) { if (__before_first != __before_last) __slist_splice_after(__pos._M_node, __before_first._M_node, __before_last._M_node); } /// Moves the element that follows __prev to *this, inserting it immediately /// after __pos. This is constant time. void splice_after(iterator __pos, iterator __prev) { __slist_splice_after(__pos._M_node, __prev._M_node, __prev._M_node->_M_next); } /// Removes all of the elements from the list __x to *this, inserting /// them immediately after __pos. __x must not be *this. Complexity: /// linear in __x.size(). void splice_after(iterator __pos, slist& __x) { __slist_splice_after(__pos._M_node, &__x._M_head); } /// Linear in distance(begin(), __pos), and lin |