⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slist

📁 linux下编程用 编译软件
💻
📖 第 1 页 / 共 2 页
字号:
        void        _M_insert_after_range(_Node_base* __pos,			      _InIterator __first, _InIterator __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 <class _InIterator>        void        insert_after(iterator __pos, _InIterator __first, _InIterator __last)        { _M_insert_after_range(__pos._M_node, __first, __last); }      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 <class _InIterator>        void        insert(iterator __pos, _InIterator __first, _InIterator __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));      }      iterator      erase(iterator __pos)      { 	return iterator((_Node*) this->_M_erase_after			(__slist_previous(&this->_M_head, __pos._M_node)));      }      iterator      erase(iterator __first, iterator __last)      { 	return iterator((_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 + 1, __before_last + 1) 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 linear in __x.size().      void      splice(iterator __pos, slist& __x)      {	if (__x._M_head._M_next)	  __slist_splice_after(__slist_previous(&this->_M_head, __pos._M_node),			       &__x._M_head,			       __slist_previous(&__x._M_head, 0)); }      // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i).      void      splice(iterator __pos, slist& __x, iterator __i)      { __slist_splice_after(__slist_previous(&this->_M_head, __pos._M_node),			     __slist_previous(&__x._M_head, __i._M_node),			     __i._M_node); }      // Linear in distance(begin(), __pos), in distance(__x.begin(), __first),      // and in distance(__first, __last).      void      splice(iterator __pos, slist& __x, iterator __first, iterator __last)      {	if (__first != __last)	  __slist_splice_after(__slist_previous(&this->_M_head, __pos._M_node),			       __slist_previous(&__x._M_head, __first._M_node),			       __slist_previous(__first._M_node,						__last._M_node));      }    public:      void      reverse()      {	if (this->_M_head._M_next)	  this->_M_head._M_next = __slist_reverse(this->_M_head._M_next);      }      void      remove(const _Tp& __val);      void      unique();            void      merge(slist& __x);            void      sort();      template <class _Predicate>        void        remove_if(_Predicate __pred);      template <class _BinaryPredicate>        void        unique(_BinaryPredicate __pred);      template <class _StrictWeakOrdering>        void        merge(slist&, _StrictWeakOrdering);      template <class _StrictWeakOrdering>        void        sort(_StrictWeakOrdering __comp);    };  template <class _Tp, class _Alloc>    slist<_Tp, _Alloc>&    slist<_Tp, _Alloc>::operator=(const slist<_Tp, _Alloc>& __x)    {      if (&__x != this)	{	  _Node_base* __p1 = &this->_M_head;	  _Node* __n1 = (_Node*) this->_M_head._M_next;	  const _Node* __n2 = (const _Node*) __x._M_head._M_next;	  while (__n1 && __n2)	    {	      __n1->_M_data = __n2->_M_data;	      __p1 = __n1;	      __n1 = (_Node*) __n1->_M_next;	      __n2 = (const _Node*) __n2->_M_next;	    }	  if (__n2 == 0)	    this->_M_erase_after(__p1, 0);	  else	    _M_insert_after_range(__p1, const_iterator((_Node*)__n2),                                  const_iterator(0));	}      return *this;    }  template <class _Tp, class _Alloc>    void    slist<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val)    {      _Node_base* __prev = &this->_M_head;      _Node* __node = (_Node*) this->_M_head._M_next;      for (; __node != 0 && __n > 0; --__n)	{	  __node->_M_data = __val;	  __prev = __node;	  __node = (_Node*) __node->_M_next;	}      if (__n > 0)	_M_insert_after_fill(__prev, __n, __val);      else	this->_M_erase_after(__prev, 0);    }    template <class _Tp, class _Alloc>    template <class _InputIterator>      void      slist<_Tp, _Alloc>::_M_assign_dispatch(_InputIterator __first,					     _InputIterator __last,					     __false_type)      {	_Node_base* __prev = &this->_M_head;	_Node* __node = (_Node*) this->_M_head._M_next;	while (__node != 0 && __first != __last)	  {	    __node->_M_data = *__first;	    __prev = __node;	    __node = (_Node*) __node->_M_next;	    ++__first;	  }	if (__first != __last)	  _M_insert_after_range(__prev, __first, __last);	else	  this->_M_erase_after(__prev, 0);      }    template <class _Tp, class _Alloc>    inline bool    operator==(const slist<_Tp, _Alloc>& _SL1, const slist<_Tp, _Alloc>& _SL2)    {      typedef typename slist<_Tp,_Alloc>::const_iterator const_iterator;      const_iterator __end1 = _SL1.end();      const_iterator __end2 = _SL2.end();            const_iterator __i1 = _SL1.begin();      const_iterator __i2 = _SL2.begin();      while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2)	{	  ++__i1;	  ++__i2;	}      return __i1 == __end1 && __i2 == __end2;    }  template <class _Tp, class _Alloc>    inline bool    operator<(const slist<_Tp, _Alloc>& _SL1, const slist<_Tp, _Alloc>& _SL2)    { return std::lexicographical_compare(_SL1.begin(), _SL1.end(),					  _SL2.begin(), _SL2.end()); }  template <class _Tp, class _Alloc>    inline bool    operator!=(const slist<_Tp, _Alloc>& _SL1, const slist<_Tp, _Alloc>& _SL2)    { return !(_SL1 == _SL2); }  template <class _Tp, class _Alloc>    inline bool    operator>(const slist<_Tp, _Alloc>& _SL1, const slist<_Tp, _Alloc>& _SL2)    { return _SL2 < _SL1; }  template <class _Tp, class _Alloc>    inline bool    operator<=(const slist<_Tp, _Alloc>& _SL1, const slist<_Tp, _Alloc>& _SL2)    { return !(_SL2 < _SL1); }  template <class _Tp, class _Alloc>    inline bool    operator>=(const slist<_Tp, _Alloc>& _SL1, const slist<_Tp, _Alloc>& _SL2)    { return !(_SL1 < _SL2); }  template <class _Tp, class _Alloc>    inline void    swap(slist<_Tp, _Alloc>& __x, slist<_Tp, _Alloc>& __y)    { __x.swap(__y); }  template <class _Tp, class _Alloc>    void    slist<_Tp, _Alloc>::resize(size_type __len, const _Tp& __x)    {      _Node_base* __cur = &this->_M_head;      while (__cur->_M_next != 0 && __len > 0)	{	  --__len;	  __cur = __cur->_M_next;	}      if (__cur->_M_next)	this->_M_erase_after(__cur, 0);      else	_M_insert_after_fill(__cur, __len, __x);    }  template <class _Tp, class _Alloc>    void    slist<_Tp, _Alloc>::remove(const _Tp& __val)    {       _Node_base* __cur = &this->_M_head;      while (__cur && __cur->_M_next)	{	  if (((_Node*) __cur->_M_next)->_M_data == __val)	    this->_M_erase_after(__cur);	  else	    __cur = __cur->_M_next;	}    }  template <class _Tp, class _Alloc>    void    slist<_Tp, _Alloc>::unique()    {      _Node_base* __cur = this->_M_head._M_next;      if (__cur)	{	  while (__cur->_M_next)	    {	      if (((_Node*)__cur)->_M_data		  == ((_Node*)(__cur->_M_next))->_M_data)		this->_M_erase_after(__cur);	      else		__cur = __cur->_M_next;	    }	}    }  template <class _Tp, class _Alloc>    void    slist<_Tp, _Alloc>::merge(slist<_Tp, _Alloc>& __x)    {      _Node_base* __n1 = &this->_M_head;      while (__n1->_M_next && __x._M_head._M_next)	{	  if (((_Node*) __x._M_head._M_next)->_M_data	      < ((_Node*) __n1->_M_next)->_M_data)	    __slist_splice_after(__n1, &__x._M_head, __x._M_head._M_next);	  __n1 = __n1->_M_next;	}      if (__x._M_head._M_next)	{	  __n1->_M_next = __x._M_head._M_next;	  __x._M_head._M_next = 0;	}    }  template <class _Tp, class _Alloc>    void    slist<_Tp, _Alloc>::sort()    {      if (this->_M_head._M_next && this->_M_head._M_next->_M_next)	{	  slist __carry;	  slist __counter[64];	  int __fill = 0;	  while (!empty())	    {	      __slist_splice_after(&__carry._M_head,				   &this->_M_head, this->_M_head._M_next);	      int __i = 0;	      while (__i < __fill && !__counter[__i].empty())		{		  __counter[__i].merge(__carry);		  __carry.swap(__counter[__i]);		  ++__i;		}	      __carry.swap(__counter[__i]);	      if (__i == __fill)		++__fill;	    }	  	  for (int __i = 1; __i < __fill; ++__i)	    __counter[__i].merge(__counter[__i-1]);	  this->swap(__counter[__fill-1]);	}    }  template <class _Tp, class _Alloc>    template <class _Predicate>      void slist<_Tp, _Alloc>::remove_if(_Predicate __pred)      {	_Node_base* __cur = &this->_M_head;	while (__cur->_M_next)	  {	    if (__pred(((_Node*) __cur->_M_next)->_M_data))	      this->_M_erase_after(__cur);	    else	      __cur = __cur->_M_next;	  }      }  template <class _Tp, class _Alloc>    template <class _BinaryPredicate>      void      slist<_Tp, _Alloc>::unique(_BinaryPredicate __pred)      {	_Node* __cur = (_Node*) this->_M_head._M_next;	if (__cur)	  {	    while (__cur->_M_next)	      {		if (__pred(((_Node*)__cur)->_M_data,			   ((_Node*)(__cur->_M_next))->_M_data))		  this->_M_erase_after(__cur);		else		  __cur = (_Node*) __cur->_M_next;	      }	  }      }  template <class _Tp, class _Alloc>    template <class _StrictWeakOrdering>      void      slist<_Tp, _Alloc>::merge(slist<_Tp, _Alloc>& __x,			       _StrictWeakOrdering __comp)      {	_Node_base* __n1 = &this->_M_head;	while (__n1->_M_next && __x._M_head._M_next)	  {	    if (__comp(((_Node*) __x._M_head._M_next)->_M_data,		       ((_Node*) __n1->_M_next)->_M_data))	      __slist_splice_after(__n1, &__x._M_head, __x._M_head._M_next);	    __n1 = __n1->_M_next;	  }	if (__x._M_head._M_next)	  {	    __n1->_M_next = __x._M_head._M_next;	    __x._M_head._M_next = 0;	  }      }  template <class _Tp, class _Alloc>    template <class _StrictWeakOrdering>      void      slist<_Tp, _Alloc>::sort(_StrictWeakOrdering __comp)      {	if (this->_M_head._M_next && this->_M_head._M_next->_M_next)	  {	    slist __carry;	    slist __counter[64];	    int __fill = 0;	    while (!empty())	      {		__slist_splice_after(&__carry._M_head,				     &this->_M_head, this->_M_head._M_next);		int __i = 0;		while (__i < __fill && !__counter[__i].empty())		  {		    __counter[__i].merge(__carry, __comp);		    __carry.swap(__counter[__i]);		    ++__i;		  }		__carry.swap(__counter[__i]);		if (__i == __fill)		  ++__fill;	      }	    for (int __i = 1; __i < __fill; ++__i)	      __counter[__i].merge(__counter[__i-1], __comp);	    this->swap(__counter[__fill-1]);	  }      }} // namespace __gnu_cxxnamespace std{  // Specialization of insert_iterator so that insertions will be constant  // time rather than linear time.  template <class _Tp, class _Alloc>    class insert_iterator<__gnu_cxx::slist<_Tp, _Alloc> >    {    protected:      typedef __gnu_cxx::slist<_Tp, _Alloc> _Container;      _Container* container;      typename _Container::iterator iter;    public:      typedef _Container          container_type;      typedef output_iterator_tag iterator_category;      typedef void                value_type;      typedef void                difference_type;      typedef void                pointer;      typedef void                reference;      insert_iterator(_Container& __x, typename _Container::iterator __i)      : container(&__x)      {	if (__i == __x.begin())	  iter = __x.before_begin();	else	  iter = __x.previous(__i);      }      insert_iterator<_Container>&      operator=(const typename _Container::value_type& __value)      {	iter = container->insert_after(iter, __value);	return *this;      }      insert_iterator<_Container>&      operator*()      { return *this; }      insert_iterator<_Container>&      operator++()      { return *this; }      insert_iterator<_Container>&      operator++(int)      { return *this; }};} // namespace std#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -