zoukankan      html  css  js  c++  java
  • C++之List的用法,reference,参考,手册,man,帮助,

    http://www.cplusplus.com/reference/stl/list/

    http://www.cppblog.com/Lee7/archive/2008/04/14/47036.html

    由于要使用一个带有C++ List的类,需要获得放入list<>数据中数据的多少.于是乎,找啊找,没找到.最后还是在Cplusplus.com找到了reference,简直太棒了,许多东西都可以在这个上面找到。

    上面cpp博客的示例很不错。挖过来了

    View Code
      1 #include <iostream> 
      2 #include <list> 
      3 #include <numeric> 
      4 #include <algorithm> 
      5 
      6 using namespace std; 
      7 
      8 //创建一个list容器的实例LISTINT 
      9 typedef list<int> LISTINT; 
     10 
     11 //创建一个list容器的实例LISTCHAR 
     12 typedef list<int> LISTCHAR; 
     13 
     14 void main(void) 
     15 { 
     16     //-------------------------- 
     17     //用list容器处理整型数据 
     18     //-------------------------- 
     19     //用LISTINT创建一个名为listOne的list对象 
     20     LISTINT listOne; 
     21     //声明i为迭代器 
     22     LISTINT::iterator i; 
     23     
     24     //从前面向listOne容器中添加数据 
     25     listOne.push_front (2); 
     26     listOne.push_front (1); 
     27     
     28     //从后面向listOne容器中添加数据 
     29     listOne.push_back (3); 
     30     listOne.push_back (4); 
     31     
     32     //从前向后显示listOne中的数据 
     33     cout<<"listOne.begin()--- listOne.end():"<<endl; 
     34     for (i = listOne.begin(); i != listOne.end(); ++i) 
     35         cout << *i << " "; 
     36     cout << endl; 
     37     
     38     //从后向后显示listOne中的数据 
     39     LISTINT::reverse_iterator ir; 
     40     cout<<"listOne.rbegin()---listOne.rend():"<<endl; 
     41     for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) { 
     42         cout << *ir << " "; 
     43     } 
     44     cout << endl; 
     45     
     46     //使用STL的accumulate(累加)算法 
     47     int result = accumulate(listOne.begin(), listOne.end(),0); 
     48     cout<<"Sum="<<result<<endl; 
     49     cout<<"------------------"<<endl; 
     50     
     51     //-------------------------- 
     52     //用list容器处理字符型数据 
     53     //-------------------------- 
     54     
     55     //用LISTCHAR创建一个名为listOne的list对象 
     56     LISTCHAR listTwo; 
     57     //声明i为迭代器 
     58     LISTCHAR::iterator j; 
     59     
     60     //从前面向listTwo容器中添加数据 
     61     listTwo.push_front ('A'); 
     62     listTwo.push_front ('B'); 
     63     
     64     //从后面向listTwo容器中添加数据 
     65     listTwo.push_back ('x'); 
     66     listTwo.push_back ('y'); 
     67     
     68     //从前向后显示listTwo中的数据 
     69     cout<<"listTwo.begin()---listTwo.end():"<<endl; 
     70     for (j = listTwo.begin(); j != listTwo.end(); ++j) 
     71         cout << char(*j) << " "; 
     72     cout << endl; 
     73     
     74     //使用STL的max_element算法求listTwo中的最大元素并显示 
     75     j=max_element(listTwo.begin(),listTwo.end()); 
     76     cout << "The maximum element in listTwo is: "<<char(*j)<<endl; 
     77 } 
     78 
     79 #include <iostream> 
     80 #include <list> 
     81 
     82 using namespace std; 
     83 typedef list<int> INTLIST; 
     84 
     85 //从前向后显示list队列的全部元素 
     86 void put_list(INTLIST list, char *name) 
     87 { 
     88     INTLIST::iterator plist; 
     89     
     90     cout << "The contents of " << name << " : "; 
     91     for(plist = list.begin(); plist != list.end(); plist++) 
     92         cout << *plist << " "; 
     93     cout<<endl; 
     94 } 
     95 
     96 //测试list容器的功能 
     97 void main(void) 
     98 { 
     99     //list1对象初始为空 
    100     INTLIST list1; 
    101     //list2对象最初有10个值为6的元素 
    102     INTLIST list2(10,6); 
    103     //list3对象最初有3个值为6的元素 
    104     INTLIST list3(list2.begin(),--list2.end()); 
    105     
    106     //声明一个名为i的双向迭代器 
    107     INTLIST::iterator i; 
    108     
    109     //从前向后显示各list对象的元素 
    110     put_list(list1,"list1"); 
    111     put_list(list2,"list2"); 
    112     put_list(list3,"list3"); 
    113     
    114     //从list1序列后面添加两个元素 
    115     list1.push_back(2); 
    116     list1.push_back(4); 
    117     cout<<"list1.push_back(2) and list1.push_back(4):"<<endl; 
    118     put_list(list1,"list1"); 
    119     
    120     //从list1序列前面添加两个元素 
    121     list1.push_front(5); 
    122     list1.push_front(7); 
    123     cout<<"list1.push_front(5) and list1.push_front(7):"<<endl; 
    124     put_list(list1,"list1"); 
    125     
    126     //在list1序列中间插入数据 
    127     list1.insert(++list1.begin(),3,9); 
    128     cout<<"list1.insert(list1.begin()+1,3,9):"<<endl; 
    129     put_list(list1,"list1"); 
    130     
    131     //测试引用类函数 
    132     cout<<"list1.front()="<<list1.front()<<endl; 
    133     cout<<"list1.back()="<<list1.back()<<endl; 
    134     
    135     //从list1序列的前后各移去一个元素 
    136     list1.pop_front(); 
    137     list1.pop_back(); 
    138     cout<<"list1.pop_front() and list1.pop_back():"<<endl; 
    139     put_list(list1,"list1"); 
    140     
    141     //清除list1中的第2个元素 
    142     list1.erase(++list1.begin()); 
    143     cout<<"list1.erase(++list1.begin()):"<<endl; 
    144     put_list(list1,"list1"); 
    145     
    146     //对list2赋值并显示 
    147     list2.assign(8,1); 
    148     cout<<"list2.assign(8,1):"<<endl; 
    149     put_list(list2,"list2"); 
    150     
    151     //显示序列的状态信息 
    152     cout<<"list1.max_size(): "<<list1.max_size()<<endl; 
    153     cout<<"list1.size(): "<<list1.size()<<endl; 
    154     cout<<"list1.empty(): "<<list1.empty()<<endl; 
    155     
    156     //list序列容器的运算 
    157     put_list(list1,"list1"); 
    158     put_list(list3,"list3"); 
    159     cout<<"list1>list3: "<<(list1>list3)<<endl; 
    160     cout<<"list1<list3: "<<(list1<list3)<<endl; 
    161     
    162     //对list1容器排序 
    163     list1.sort(); 
    164     put_list(list1,"list1"); 
    165     
    166     //结合处理 
    167     list1.splice(++list1.begin(), list3); 
    168     put_list(list1,"list1"); 
    169     put_list(list3,"list3"); 
    170 } 


    list的定义在:/usr/include/c++/4.4/bits/stl_list.h

    定义为:

    View Code
    // List implementation -*- C++ -*-
    
    // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
    // Free Software Foundation, Inc.
    //
    // This file is part of the GNU ISO C++ Library.  This library is free
    // software; you can redistribute it and/or modify it under the
    // terms of the GNU General Public License as published by the
    // Free Software Foundation; either version 3, or (at your option)
    // any later version.
    
    // This library is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    
    // Under Section 7 of GPL version 3, you are granted additional
    // permissions described in the GCC Runtime Library Exception, version
    // 3.1, as published by the Free Software Foundation.
    
    // You should have received a copy of the GNU General Public License and
    // a copy of the GCC Runtime Library Exception along with this program;
    // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    // <http://www.gnu.org/licenses/>.
    
    /*
     *
     * Copyright (c) 1994
     * Hewlett-Packard Company
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Hewlett-Packard Company makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     *
     *
     * Copyright (c) 1996,1997
     * Silicon Graphics Computer Systems, Inc.
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Silicon Graphics makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     */
    
    /** @file stl_list.h
     *  This is an internal header file, included by other library headers.
     *  You should not attempt to use it directly.
     */
    
    #ifndef _STL_LIST_H
    #define _STL_LIST_H 1
    
    #include <bits/concept_check.h>
    #include <initializer_list>
    
    _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
    
      // Supporting structures are split into common and templated types; the
      // latter publicly inherits from the former in an effort to reduce code
      // duplication.  This results in some "needless" static_cast'ing later on,
      // but it's all safe downcasting.
    
      /// Common part of a node in the %list. 
      struct _List_node_base
      {
        _List_node_base* _M_next;
        _List_node_base* _M_prev;
    
        static void
        swap(_List_node_base& __x, _List_node_base& __y);
    
        void
        transfer(_List_node_base * const __first,
             _List_node_base * const __last);
    
        void
        reverse();
    
        void
        hook(_List_node_base * const __position);
    
        void
        unhook();
      };
    
      /// An actual node in the %list.
      template<typename _Tp>
        struct _List_node : public _List_node_base
        {
          ///< User's data.
          _Tp _M_data;
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          template<typename... _Args>
            _List_node(_Args&&... __args)
        : _List_node_base(), _M_data(std::forward<_Args>(__args)...) { }
    #endif
        };
    
      /**
       *  @brief A list::iterator.
       *
       *  All the functions are op overloads.
      */
      template<typename _Tp>
        struct _List_iterator
        {
          typedef _List_iterator<_Tp>                _Self;
          typedef _List_node<_Tp>                    _Node;
    
          typedef ptrdiff_t                          difference_type;
          typedef std::bidirectional_iterator_tag    iterator_category;
          typedef _Tp                                value_type;
          typedef _Tp*                               pointer;
          typedef _Tp&                               reference;
    
          _List_iterator()
          : _M_node() { }
    
          explicit
          _List_iterator(_List_node_base* __x)
          : _M_node(__x) { }
    
          // Must downcast from List_node_base to _List_node to get to _M_data.
          reference
          operator*() const
          { return static_cast<_Node*>(_M_node)->_M_data; }
    
          pointer
          operator->() const
          { return &static_cast<_Node*>(_M_node)->_M_data; }
    
          _Self&
          operator++()
          {
        _M_node = _M_node->_M_next;
        return *this;
          }
    
          _Self
          operator++(int)
          {
        _Self __tmp = *this;
        _M_node = _M_node->_M_next;
        return __tmp;
          }
    
          _Self&
          operator--()
          {
        _M_node = _M_node->_M_prev;
        return *this;
          }
    
          _Self
          operator--(int)
          {
        _Self __tmp = *this;
        _M_node = _M_node->_M_prev;
        return __tmp;
          }
    
          bool
          operator==(const _Self& __x) const
          { return _M_node == __x._M_node; }
    
          bool
          operator!=(const _Self& __x) const
          { return _M_node != __x._M_node; }
    
          // The only member points to the %list element.
          _List_node_base* _M_node;
        };
    
      /**
       *  @brief A list::const_iterator.
       *
       *  All the functions are op overloads.
      */
      template<typename _Tp>
        struct _List_const_iterator
        {
          typedef _List_const_iterator<_Tp>          _Self;
          typedef const _List_node<_Tp>              _Node;
          typedef _List_iterator<_Tp>                iterator;
    
          typedef ptrdiff_t                          difference_type;
          typedef std::bidirectional_iterator_tag    iterator_category;
          typedef _Tp                                value_type;
          typedef const _Tp*                         pointer;
          typedef const _Tp&                         reference;
    
          _List_const_iterator()
          : _M_node() { }
    
          explicit
          _List_const_iterator(const _List_node_base* __x)
          : _M_node(__x) { }
    
          _List_const_iterator(const iterator& __x)
          : _M_node(__x._M_node) { }
    
          // Must downcast from List_node_base to _List_node to get to
          // _M_data.
          reference
          operator*() const
          { return static_cast<_Node*>(_M_node)->_M_data; }
    
          pointer
          operator->() const
          { return &static_cast<_Node*>(_M_node)->_M_data; }
    
          _Self&
          operator++()
          {
        _M_node = _M_node->_M_next;
        return *this;
          }
    
          _Self
          operator++(int)
          {
        _Self __tmp = *this;
        _M_node = _M_node->_M_next;
        return __tmp;
          }
    
          _Self&
          operator--()
          {
        _M_node = _M_node->_M_prev;
        return *this;
          }
    
          _Self
          operator--(int)
          {
        _Self __tmp = *this;
        _M_node = _M_node->_M_prev;
        return __tmp;
          }
    
          bool
          operator==(const _Self& __x) const
          { return _M_node == __x._M_node; }
    
          bool
          operator!=(const _Self& __x) const
          { return _M_node != __x._M_node; }
    
          // The only member points to the %list element.
          const _List_node_base* _M_node;
        };
    
      template<typename _Val>
        inline bool
        operator==(const _List_iterator<_Val>& __x,
               const _List_const_iterator<_Val>& __y)
        { return __x._M_node == __y._M_node; }
    
      template<typename _Val>
        inline bool
        operator!=(const _List_iterator<_Val>& __x,
                   const _List_const_iterator<_Val>& __y)
        { return __x._M_node != __y._M_node; }
    
    
      /// See bits/stl_deque.h's _Deque_base for an explanation.
      template<typename _Tp, typename _Alloc>
        class _List_base
        {
        protected:
          // NOTA BENE
          // The stored instance is not actually of "allocator_type"'s
          // type.  Instead we rebind the type to
          // Allocator<List_node<Tp>>, which according to [20.1.5]/4
          // should probably be the same.  List_node<Tp> is not the same
          // size as Tp (it's two pointers larger), and specializations on
          // Tp may go unused because List_node<Tp> is being bound
          // instead.
          //
          // We put this to the test in the constructors and in
          // get_allocator, where we use conversions between
          // allocator_type and _Node_alloc_type. The conversion is
          // required by table 32 in [20.1.5].
          typedef typename _Alloc::template rebind<_List_node<_Tp> >::other
            _Node_alloc_type;
    
          typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
    
          struct _List_impl 
          : public _Node_alloc_type
          {
        _List_node_base _M_node;
    
        _List_impl()
        : _Node_alloc_type(), _M_node()
        { }
    
        _List_impl(const _Node_alloc_type& __a)
        : _Node_alloc_type(__a), _M_node()
        { }
          };
    
          _List_impl _M_impl;
    
          _List_node<_Tp>*
          _M_get_node()
          { return _M_impl._Node_alloc_type::allocate(1); }
          
          void
          _M_put_node(_List_node<_Tp>* __p)
          { _M_impl._Node_alloc_type::deallocate(__p, 1); }
          
      public:
          typedef _Alloc allocator_type;
    
          _Node_alloc_type&
          _M_get_Node_allocator()
          { return *static_cast<_Node_alloc_type*>(&this->_M_impl); }
    
          const _Node_alloc_type&
          _M_get_Node_allocator() const
          { return *static_cast<const _Node_alloc_type*>(&this->_M_impl); }
    
          _Tp_alloc_type
          _M_get_Tp_allocator() const
          { return _Tp_alloc_type(_M_get_Node_allocator()); }
    
          allocator_type
          get_allocator() const
          { return allocator_type(_M_get_Node_allocator()); }
    
          _List_base()
          : _M_impl()
          { _M_init(); }
    
          _List_base(const allocator_type& __a)
          : _M_impl(__a)
          { _M_init(); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          _List_base(_List_base&& __x)
          : _M_impl(__x._M_get_Node_allocator())
          {
        _M_init();
        _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node);    
          }
    #endif
    
          // This is what actually destroys the list.
          ~_List_base()
          { _M_clear(); }
    
          void
          _M_clear();
    
          void
          _M_init()
          {
            this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
            this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
          }
        };
    
      /**
       *  @brief A standard container with linear time access to elements,
       *  and fixed time insertion/deletion at any point in the sequence.
       *
       *  @ingroup sequences
       *
       *  Meets the requirements of a <a href="tables.html#65">container</a>, a
       *  <a href="tables.html#66">reversible container</a>, and a
       *  <a href="tables.html#67">sequence</a>, including the
       *  <a href="tables.html#68">optional sequence requirements</a> with the
       *  %exception of @c at and @c operator[].
       *
       *  This is a @e doubly @e linked %list.  Traversal up and down the
       *  %list requires linear time, but adding and removing elements (or
       *  @e nodes) is done in constant time, regardless of where the
       *  change takes place.  Unlike std::vector and std::deque,
       *  random-access iterators are not provided, so subscripting ( @c
       *  [] ) access is not allowed.  For algorithms which only need
       *  sequential access, this lack makes no difference.
       *
       *  Also unlike the other standard containers, std::list provides
       *  specialized algorithms %unique to linked lists, such as
       *  splicing, sorting, and in-place reversal.
       *
       *  A couple points on memory allocation for list<Tp>:
       *
       *  First, we never actually allocate a Tp, we allocate
       *  List_node<Tp>'s and trust [20.1.5]/4 to DTRT.  This is to ensure
       *  that after elements from %list<X,Alloc1> are spliced into
       *  %list<X,Alloc2>, destroying the memory of the second %list is a
       *  valid operation, i.e., Alloc1 giveth and Alloc2 taketh away.
       *
       *  Second, a %list conceptually represented as
       *  @code
       *    A <---> B <---> C <---> D
       *  @endcode
       *  is actually circular; a link exists between A and D.  The %list
       *  class holds (as its only data member) a private list::iterator
       *  pointing to @e D, not to @e A!  To get to the head of the %list,
       *  we start at the tail and move forward by one.  When this member
       *  iterator's next/previous pointers refer to itself, the %list is
       *  %empty. 
      */
      template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
        class list : protected _List_base<_Tp, _Alloc>
        {
          // concept requirements
          typedef typename _Alloc::value_type                _Alloc_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
    
          typedef _List_base<_Tp, _Alloc>                    _Base;
          typedef typename _Base::_Tp_alloc_type         _Tp_alloc_type;
    
        public:
          typedef _Tp                                        value_type;
          typedef typename _Tp_alloc_type::pointer           pointer;
          typedef typename _Tp_alloc_type::const_pointer     const_pointer;
          typedef typename _Tp_alloc_type::reference         reference;
          typedef typename _Tp_alloc_type::const_reference   const_reference;
          typedef _List_iterator<_Tp>                        iterator;
          typedef _List_const_iterator<_Tp>                  const_iterator;
          typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;
          typedef std::reverse_iterator<iterator>            reverse_iterator;
          typedef size_t                                     size_type;
          typedef ptrdiff_t                                  difference_type;
          typedef _Alloc                                     allocator_type;
    
        protected:
          // Note that pointers-to-_Node's can be ctor-converted to
          // iterator types.
          typedef _List_node<_Tp>                 _Node;
    
          using _Base::_M_impl;
          using _Base::_M_put_node;
          using _Base::_M_get_node;
          using _Base::_M_get_Tp_allocator;
          using _Base::_M_get_Node_allocator;
    
          /**
           *  @param  x  An instance of user data.
           *
           *  Allocates space for a new node and constructs a copy of @a x in it.
           */
    #ifndef __GXX_EXPERIMENTAL_CXX0X__
          _Node*
          _M_create_node(const value_type& __x)
          {
        _Node* __p = this->_M_get_node();
        __try
          {
            _M_get_Tp_allocator().construct(&__p->_M_data, __x);
          }
        __catch(...)
          {
            _M_put_node(__p);
            __throw_exception_again;
          }
        return __p;
          }
    #else
          template<typename... _Args>
            _Node*
            _M_create_node(_Args&&... __args)
        {
          _Node* __p = this->_M_get_node();
          __try
            {
              _M_get_Node_allocator().construct(__p,
                            std::forward<_Args>(__args)...);
            }
          __catch(...)
            {
              _M_put_node(__p);
              __throw_exception_again;
            }
          return __p;
        }
    #endif
    
        public:
          // [23.2.2.1] construct/copy/destroy
          // (assign() and get_allocator() are also listed in this section)
          /**
           *  @brief  Default constructor creates no elements.
           */
          list()
          : _Base() { }
    
          /**
           *  @brief  Creates a %list with no elements.
           *  @param  a  An allocator object.
           */
          explicit
          list(const allocator_type& __a)
          : _Base(__a) { }
    
          /**
           *  @brief  Creates a %list with copies of an exemplar element.
           *  @param  n  The number of elements to initially create.
           *  @param  value  An element to copy.
           *  @param  a  An allocator object.
           *
           *  This constructor fills the %list with @a n copies of @a value.
           */
          explicit
          list(size_type __n, const value_type& __value = value_type(),
           const allocator_type& __a = allocator_type())
          : _Base(__a)
          { _M_fill_initialize(__n, __value); }
    
          /**
           *  @brief  %List copy constructor.
           *  @param  x  A %list of identical element and allocator types.
           *
           *  The newly-created %list uses a copy of the allocation object used
           *  by @a x.
           */
          list(const list& __x)
          : _Base(__x._M_get_Node_allocator())
          { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          /**
           *  @brief  %List move constructor.
           *  @param  x  A %list of identical element and allocator types.
           *
           *  The newly-created %list contains the exact contents of @a x.
           *  The contents of @a x are a valid, but unspecified %list.
           */
          list(list&& __x)
          : _Base(std::forward<_Base>(__x)) { }
    
          /**
           *  @brief  Builds a %list from an initializer_list
           *  @param  l  An initializer_list of value_type.
           *  @param  a  An allocator object.
           *
           *  Create a %list consisting of copies of the elements in the
           *  initializer_list @a l.  This is linear in l.size().
           */
          list(initializer_list<value_type> __l,
               const allocator_type& __a = allocator_type())
          : _Base(__a)
          { _M_initialize_dispatch(__l.begin(), __l.end(), __false_type()); }
    #endif
    
          /**
           *  @brief  Builds a %list from a range.
           *  @param  first  An input iterator.
           *  @param  last  An input iterator.
           *  @param  a  An allocator object.
           *
           *  Create a %list consisting of copies of the elements from
           *  [@a first,@a last).  This is linear in N (where N is
           *  distance(@a first,@a last)).
           */
          template<typename _InputIterator>
            list(_InputIterator __first, _InputIterator __last,
             const allocator_type& __a = allocator_type())
            : _Base(__a)
            { 
          // Check whether it's an integral type.  If so, it's not an iterator.
          typedef typename std::__is_integer<_InputIterator>::__type _Integral;
          _M_initialize_dispatch(__first, __last, _Integral());
        }
    
          /**
           *  No explicit dtor needed as the _Base dtor takes care of
           *  things.  The _Base dtor only erases the elements, and note
           *  that if the elements themselves are pointers, the pointed-to
           *  memory is not touched in any way.  Managing the pointer is
           *  the user's responsibility.
           */
    
          /**
           *  @brief  %List assignment operator.
           *  @param  x  A %list of identical element and allocator types.
           *
           *  All the elements of @a x are copied, but unlike the copy
           *  constructor, the allocator object is not copied.
           */
          list&
          operator=(const list& __x);
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          /**
           *  @brief  %List move assignment operator.
           *  @param  x  A %list of identical element and allocator types.
           *
           *  The contents of @a x are moved into this %list (without copying).
           *  @a x is a valid, but unspecified %list
           */
          list&
          operator=(list&& __x)
          {
        // NB: DR 675.
        this->clear();
        this->swap(__x); 
        return *this;
          }
    
          /**
           *  @brief  %List initializer list assignment operator.
           *  @param  l  An initializer_list of value_type.
           *
           *  Replace the contents of the %list with copies of the elements
           *  in the initializer_list @a l.  This is linear in l.size().
           */
          list&
          operator=(initializer_list<value_type> __l)
          {
        this->assign(__l.begin(), __l.end());
        return *this;
          }
    #endif
    
          /**
           *  @brief  Assigns a given value to a %list.
           *  @param  n  Number of elements to be assigned.
           *  @param  val  Value to be assigned.
           *
           *  This function fills a %list with @a n copies of the given
           *  value.  Note that the assignment completely changes the %list
           *  and that the resulting %list's size is the same as the number
           *  of elements assigned.  Old data may be lost.
           */
          void
          assign(size_type __n, const value_type& __val)
          { _M_fill_assign(__n, __val); }
    
          /**
           *  @brief  Assigns a range to a %list.
           *  @param  first  An input iterator.
           *  @param  last   An input iterator.
           *
           *  This function fills a %list with copies of the elements in the
           *  range [@a first,@a last).
           *
           *  Note that the assignment completely changes the %list and
           *  that the resulting %list's size is the same as the number of
           *  elements assigned.  Old data may be lost.
           */
          template<typename _InputIterator>
            void
            assign(_InputIterator __first, _InputIterator __last)
            {
          // Check whether it's an integral type.  If so, it's not an iterator.
          typedef typename std::__is_integer<_InputIterator>::__type _Integral;
          _M_assign_dispatch(__first, __last, _Integral());
        }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          /**
           *  @brief  Assigns an initializer_list to a %list.
           *  @param  l  An initializer_list of value_type.
           *
           *  Replace the contents of the %list with copies of the elements
           *  in the initializer_list @a l.  This is linear in l.size().
           */
          void
          assign(initializer_list<value_type> __l)
          { this->assign(__l.begin(), __l.end()); }
    #endif
    
          /// Get a copy of the memory allocation object.
          allocator_type
          get_allocator() const
          { return _Base::get_allocator(); }
    
          // iterators
          /**
           *  Returns a read/write iterator that points to the first element in the
           *  %list.  Iteration is done in ordinary element order.
           */
          iterator
          begin()
          { return iterator(this->_M_impl._M_node._M_next); }
    
          /**
           *  Returns a read-only (constant) iterator that points to the
           *  first element in the %list.  Iteration is done in ordinary
           *  element order.
           */
          const_iterator
          begin() const
          { return const_iterator(this->_M_impl._M_node._M_next); }
    
          /**
           *  Returns a read/write iterator that points one past the last
           *  element in the %list.  Iteration is done in ordinary element
           *  order.
           */
          iterator
          end()
          { return iterator(&this->_M_impl._M_node); }
    
          /**
           *  Returns a read-only (constant) iterator that points one past
           *  the last element in the %list.  Iteration is done in ordinary
           *  element order.
           */
          const_iterator
          end() const
          { return const_iterator(&this->_M_impl._M_node); }
    
          /**
           *  Returns a read/write reverse iterator that points to the last
           *  element in the %list.  Iteration is done in reverse element
           *  order.
           */
          reverse_iterator
          rbegin()
          { return reverse_iterator(end()); }
    
          /**
           *  Returns a read-only (constant) reverse iterator that points to
           *  the last element in the %list.  Iteration is done in reverse
           *  element order.
           */
          const_reverse_iterator
          rbegin() const
          { return const_reverse_iterator(end()); }
    
          /**
           *  Returns a read/write reverse iterator that points to one
           *  before the first element in the %list.  Iteration is done in
           *  reverse element order.
           */
          reverse_iterator
          rend()
          { return reverse_iterator(begin()); }
    
          /**
           *  Returns a read-only (constant) reverse iterator that points to one
           *  before the first element in the %list.  Iteration is done in reverse
           *  element order.
           */
          const_reverse_iterator
          rend() const
          { return const_reverse_iterator(begin()); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          /**
           *  Returns a read-only (constant) iterator that points to the
           *  first element in the %list.  Iteration is done in ordinary
           *  element order.
           */
          const_iterator
          cbegin() const
          { return const_iterator(this->_M_impl._M_node._M_next); }
    
          /**
           *  Returns a read-only (constant) iterator that points one past
           *  the last element in the %list.  Iteration is done in ordinary
           *  element order.
           */
          const_iterator
          cend() const
          { return const_iterator(&this->_M_impl._M_node); }
    
          /**
           *  Returns a read-only (constant) reverse iterator that points to
           *  the last element in the %list.  Iteration is done in reverse
           *  element order.
           */
          const_reverse_iterator
          crbegin() const
          { return const_reverse_iterator(end()); }
    
          /**
           *  Returns a read-only (constant) reverse iterator that points to one
           *  before the first element in the %list.  Iteration is done in reverse
           *  element order.
           */
          const_reverse_iterator
          crend() const
          { return const_reverse_iterator(begin()); }
    #endif
    
          // [23.2.2.2] capacity
          /**
           *  Returns true if the %list is empty.  (Thus begin() would equal
           *  end().)
           */
          bool
          empty() const
          { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
    
          /**  Returns the number of elements in the %list.  */
          size_type
          size() const
          { return std::distance(begin(), end()); }
    
          /**  Returns the size() of the largest possible %list.  */
          size_type
          max_size() const
          { return _M_get_Node_allocator().max_size(); }
    
          /**
           *  @brief Resizes the %list to the specified number of elements.
           *  @param new_size Number of elements the %list should contain.
           *  @param x Data with which new elements should be populated.
           *
           *  This function will %resize the %list to the specified number
           *  of elements.  If the number is smaller than the %list's
           *  current size the %list is truncated, otherwise the %list is
           *  extended and new elements are populated with given data.
           */
          void
          resize(size_type __new_size, value_type __x = value_type());
    
          // element access
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %list.
           */
          reference
          front()
          { return *begin(); }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %list.
           */
          const_reference
          front() const
          { return *begin(); }
    
          /**
           *  Returns a read/write reference to the data at the last element
           *  of the %list.
           */
          reference
          back()
          { 
        iterator __tmp = end();
        --__tmp;
        return *__tmp;
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %list.
           */
          const_reference
          back() const
          { 
        const_iterator __tmp = end();
        --__tmp;
        return *__tmp;
          }
    
          // [23.2.2.3] modifiers
          /**
           *  @brief  Add data to the front of the %list.
           *  @param  x  Data to be added.
           *
           *  This is a typical stack operation.  The function creates an
           *  element at the front of the %list and assigns the given data
           *  to it.  Due to the nature of a %list this operation can be
           *  done in constant time, and does not invalidate iterators and
           *  references.
           */
          void
          push_front(const value_type& __x)
          { this->_M_insert(begin(), __x); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          void
          push_front(value_type&& __x)
          { this->_M_insert(begin(), std::move(__x)); }
    
          template<typename... _Args>
            void
            emplace_front(_Args&&... __args)
            { this->_M_insert(begin(), std::forward<_Args>(__args)...); }
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical stack operation.  It shrinks the %list by
           *  one.  Due to the nature of a %list this operation can be done
           *  in constant time, and only invalidates iterators/references to
           *  the element being removed.
           *
           *  Note that no data is returned, and if the first element's data
           *  is needed, it should be retrieved before pop_front() is
           *  called.
           */
          void
          pop_front()
          { this->_M_erase(begin()); }
    
          /**
           *  @brief  Add data to the end of the %list.
           *  @param  x  Data to be added.
           *
           *  This is a typical stack operation.  The function creates an
           *  element at the end of the %list and assigns the given data to
           *  it.  Due to the nature of a %list this operation can be done
           *  in constant time, and does not invalidate iterators and
           *  references.
           */
          void
          push_back(const value_type& __x)
          { this->_M_insert(end(), __x); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          void
          push_back(value_type&& __x)
          { this->_M_insert(end(), std::move(__x)); }
    
          template<typename... _Args>
            void
            emplace_back(_Args&&... __args)
            { this->_M_insert(end(), std::forward<_Args>(__args)...); }
    #endif
    
          /**
           *  @brief  Removes last element.
           *
           *  This is a typical stack operation.  It shrinks the %list by
           *  one.  Due to the nature of a %list this operation can be done
           *  in constant time, and only invalidates iterators/references to
           *  the element being removed.
           *
           *  Note that no data is returned, and if the last element's data
           *  is needed, it should be retrieved before pop_back() is called.
           */
          void
          pop_back()
          { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          /**
           *  @brief  Constructs object in %list before specified iterator.
           *  @param  position  A const_iterator into the %list.
           *  @param  args  Arguments.
           *  @return  An iterator that points to the inserted data.
           *
           *  This function will insert an object of type T constructed
           *  with T(std::forward<Args>(args)...) before the specified
           *  location.  Due to the nature of a %list this operation can
           *  be done in constant time, and does not invalidate iterators
           *  and references.
           */
          template<typename... _Args>
            iterator
            emplace(iterator __position, _Args&&... __args);
    #endif
    
          /**
           *  @brief  Inserts given value into %list before specified iterator.
           *  @param  position  An iterator into the %list.
           *  @param  x  Data to be inserted.
           *  @return  An iterator that points to the inserted data.
           *
           *  This function will insert a copy of the given value before
           *  the specified location.  Due to the nature of a %list this
           *  operation can be done in constant time, and does not
           *  invalidate iterators and references.
           */
          iterator
          insert(iterator __position, const value_type& __x);
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          /**
           *  @brief  Inserts given rvalue into %list before specified iterator.
           *  @param  position  An iterator into the %list.
           *  @param  x  Data to be inserted.
           *  @return  An iterator that points to the inserted data.
           *
           *  This function will insert a copy of the given rvalue before
           *  the specified location.  Due to the nature of a %list this
           *  operation can be done in constant time, and does not
           *  invalidate iterators and references.
            */
          iterator
          insert(iterator __position, value_type&& __x)
          { return emplace(__position, std::move(__x)); }
    
          /**
           *  @brief  Inserts the contents of an initializer_list into %list
           *          before specified iterator.
           *  @param  p  An iterator into the %list.
           *  @param  l  An initializer_list of value_type.
           *
           *  This function will insert copies of the data in the
           *  initializer_list @a l into the %list before the location
           *  specified by @a p.
           *
           *  This operation is linear in the number of elements inserted and
           *  does not invalidate iterators and references.
           */
          void
          insert(iterator __p, initializer_list<value_type> __l)
          { this->insert(__p, __l.begin(), __l.end()); }
    #endif
    
          /**
           *  @brief  Inserts a number of copies of given data into the %list.
           *  @param  position  An iterator into the %list.
           *  @param  n  Number of elements to be inserted.
           *  @param  x  Data to be inserted.
           *
           *  This function will insert a specified number of copies of the
           *  given data before the location specified by @a position.
           *
           *  This operation is linear in the number of elements inserted and
           *  does not invalidate iterators and references.
           */
          void
          insert(iterator __position, size_type __n, const value_type& __x)
          {  
        list __tmp(__n, __x, _M_get_Node_allocator());
        splice(__position, __tmp);
          }
    
          /**
           *  @brief  Inserts a range into the %list.
           *  @param  position  An iterator into the %list.
           *  @param  first  An input iterator.
           *  @param  last   An input iterator.
           *
           *  This function will insert copies of the data in the range [@a
           *  first,@a last) into the %list before the location specified by
           *  @a position.
           *
           *  This operation is linear in the number of elements inserted and
           *  does not invalidate iterators and references.
           */
          template<typename _InputIterator>
            void
            insert(iterator __position, _InputIterator __first,
               _InputIterator __last)
            {
          list __tmp(__first, __last, _M_get_Node_allocator());
          splice(__position, __tmp);
        }
    
          /**
           *  @brief  Remove element at given position.
           *  @param  position  Iterator pointing to element to be erased.
           *  @return  An iterator pointing to the next element (or end()).
           *
           *  This function will erase the element at the given position and thus
           *  shorten the %list by one.
           *
           *  Due to the nature of a %list this operation can be done in
           *  constant time, and only invalidates iterators/references to
           *  the element being removed.  The user is also cautioned that
           *  this function only erases the element, and that if the element
           *  is itself a pointer, the pointed-to memory is not touched in
           *  any way.  Managing the pointer is the user's responsibility.
           */
          iterator
          erase(iterator __position);
    
          /**
           *  @brief  Remove a range of elements.
           *  @param  first  Iterator pointing to the first element to be erased.
           *  @param  last  Iterator pointing to one past the last element to be
           *                erased.
           *  @return  An iterator pointing to the element pointed to by @a last
           *           prior to erasing (or end()).
           *
           *  This function will erase the elements in the range @a
           *  [first,last) and shorten the %list accordingly.
           *
           *  This operation is linear time in the size of the range and only
           *  invalidates iterators/references to the element being removed.
           *  The user is also cautioned that this function only erases the
           *  elements, and that if the elements themselves are pointers, the
           *  pointed-to memory is not touched in any way.  Managing the pointer
           *  is the user's responsibility.
           */
          iterator
          erase(iterator __first, iterator __last)
          {
        while (__first != __last)
          __first = erase(__first);
        return __last;
          }
    
          /**
           *  @brief  Swaps data with another %list.
           *  @param  x  A %list of the same element and allocator types.
           *
           *  This exchanges the elements between two lists in constant
           *  time.  Note that the global std::swap() function is
           *  specialized such that std::swap(l1,l2) will feed to this
           *  function.
           */
          void
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          swap(list&& __x)
    #else
          swap(list& __x)
    #endif
          {
        _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node);
    
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 431. Swapping containers with unequal allocators.
        std::__alloc_swap<typename _Base::_Node_alloc_type>::
          _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator());
          }
    
          /**
           *  Erases all the elements.  Note that this function only erases
           *  the elements, and that if the elements themselves are
           *  pointers, the pointed-to memory is not touched in any way.
           *  Managing the pointer is the user's responsibility.
           */
          void
          clear()
          {
            _Base::_M_clear();
            _Base::_M_init();
          }
    
          // [23.2.2.4] list operations
          /**
           *  @brief  Insert contents of another %list.
           *  @param  position  Iterator referencing the element to insert before.
           *  @param  x  Source list.
           *
           *  The elements of @a x are inserted in constant time in front of
           *  the element referenced by @a position.  @a x becomes an empty
           *  list.
           *
           *  Requires this != @a x.
           */
          void
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          splice(iterator __position, list&& __x)
    #else
          splice(iterator __position, list& __x)
    #endif
          {
        if (!__x.empty())
          {
            _M_check_equal_allocators(__x);
    
            this->_M_transfer(__position, __x.begin(), __x.end());
          }
          }
    
          /**
           *  @brief  Insert element from another %list.
           *  @param  position  Iterator referencing the element to insert before.
           *  @param  x  Source list.
           *  @param  i  Iterator referencing the element to move.
           *
           *  Removes the element in list @a x referenced by @a i and
           *  inserts it into the current list before @a position.
           */
          void
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          splice(iterator __position, list&& __x, iterator __i)
    #else
          splice(iterator __position, list& __x, iterator __i)
    #endif
          {
        iterator __j = __i;
        ++__j;
        if (__position == __i || __position == __j)
          return;
    
        if (this != &__x)
          _M_check_equal_allocators(__x);
    
        this->_M_transfer(__position, __i, __j);
          }
    
          /**
           *  @brief  Insert range from another %list.
           *  @param  position  Iterator referencing the element to insert before.
           *  @param  x  Source list.
           *  @param  first  Iterator referencing the start of range in x.
           *  @param  last  Iterator referencing the end of range in x.
           *
           *  Removes elements in the range [first,last) and inserts them
           *  before @a position in constant time.
           *
           *  Undefined if @a position is in [first,last).
           */
          void
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          splice(iterator __position, list&& __x, iterator __first,
             iterator __last)
    #else
          splice(iterator __position, list& __x, iterator __first,
             iterator __last)
    #endif
          {
        if (__first != __last)
          {
            if (this != &__x)
              _M_check_equal_allocators(__x);
    
            this->_M_transfer(__position, __first, __last);
          }
          }
    
          /**
           *  @brief  Remove all elements equal to value.
           *  @param  value  The value to remove.
           *
           *  Removes every element in the list equal to @a value.
           *  Remaining elements stay in list order.  Note that this
           *  function only erases the elements, and that if the elements
           *  themselves are pointers, the pointed-to memory is not
           *  touched in any way.  Managing the pointer is the user's
           *  responsibility.
           */
          void
          remove(const _Tp& __value);
    
          /**
           *  @brief  Remove all elements satisfying a predicate.
           *  @param  Predicate  Unary predicate function or object.
           *
           *  Removes every element in the list for which the predicate
           *  returns true.  Remaining elements stay in list order.  Note
           *  that this function only erases the elements, and that if the
           *  elements themselves are pointers, the pointed-to memory is
           *  not touched in any way.  Managing the pointer is the user's
           *  responsibility.
           */
          template<typename _Predicate>
            void
            remove_if(_Predicate);
    
          /**
           *  @brief  Remove consecutive duplicate elements.
           *
           *  For each consecutive set of elements with the same value,
           *  remove all but the first one.  Remaining elements stay in
           *  list order.  Note that this function only erases the
           *  elements, and that if the elements themselves are pointers,
           *  the pointed-to memory is not touched in any way.  Managing
           *  the pointer is the user's responsibility.
           */
          void
          unique();
    
          /**
           *  @brief  Remove consecutive elements satisfying a predicate.
           *  @param  BinaryPredicate  Binary predicate function or object.
           *
           *  For each consecutive set of elements [first,last) that
           *  satisfy predicate(first,i) where i is an iterator in
           *  [first,last), remove all but the first one.  Remaining
           *  elements stay in list order.  Note that this function only
           *  erases the elements, and that if the elements themselves are
           *  pointers, the pointed-to memory is not touched in any way.
           *  Managing the pointer is the user's responsibility.
           */
          template<typename _BinaryPredicate>
            void
            unique(_BinaryPredicate);
    
          /**
           *  @brief  Merge sorted lists.
           *  @param  x  Sorted list to merge.
           *
           *  Assumes that both @a x and this list are sorted according to
           *  operator<().  Merges elements of @a x into this list in
           *  sorted order, leaving @a x empty when complete.  Elements in
           *  this list precede elements in @a x that are equal.
           */
          void
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
          merge(list&& __x);
    #else
          merge(list& __x);
    #endif
    
          /**
           *  @brief  Merge sorted lists according to comparison function.
           *  @param  x  Sorted list to merge.
           *  @param StrictWeakOrdering Comparison function defining
           *  sort order.
           *
           *  Assumes that both @a x and this list are sorted according to
           *  StrictWeakOrdering.  Merges elements of @a x into this list
           *  in sorted order, leaving @a x empty when complete.  Elements
           *  in this list precede elements in @a x that are equivalent
           *  according to StrictWeakOrdering().
           */
          template<typename _StrictWeakOrdering>
            void
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
            merge(list&&, _StrictWeakOrdering);
    #else
            merge(list&, _StrictWeakOrdering);
    #endif
    
          /**
           *  @brief  Reverse the elements in list.
           *
           *  Reverse the order of elements in the list in linear time.
           */
          void
          reverse()
          { this->_M_impl._M_node.reverse(); }
    
          /**
           *  @brief  Sort the elements.
           *
           *  Sorts the elements of this list in NlogN time.  Equivalent
           *  elements remain in list order.
           */
          void
          sort();
    
          /**
           *  @brief  Sort the elements according to comparison function.
           *
           *  Sorts the elements of this list in NlogN time.  Equivalent
           *  elements remain in list order.
           */
          template<typename _StrictWeakOrdering>
            void
            sort(_StrictWeakOrdering);
    
        protected:
          // Internal constructor functions follow.
    
          // Called by the range constructor to implement [23.1.1]/9
    
          // _GLIBCXX_RESOLVE_LIB_DEFECTS
          // 438. Ambiguity in the "do the right thing" clause
          template<typename _Integer>
            void
            _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
            { _M_fill_initialize(static_cast<size_type>(__n), __x); }
    
          // Called by the range constructor to implement [23.1.1]/9
          template<typename _InputIterator>
            void
            _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
                       __false_type)
            {
          for (; __first != __last; ++__first)
            push_back(*__first);
        }
    
          // Called by list(n,v,a), and the range constructor when it turns out
          // to be the same thing.
          void
          _M_fill_initialize(size_type __n, const value_type& __x)
          {
        for (; __n > 0; --__n)
          push_back(__x);
          }
    
    
          // Internal assign functions follow.
    
          // Called by the range assign to implement [23.1.1]/9
    
          // _GLIBCXX_RESOLVE_LIB_DEFECTS
          // 438. Ambiguity in the "do the right thing" clause
          template<typename _Integer>
            void
            _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
            { _M_fill_assign(__n, __val); }
    
          // Called by the range assign to implement [23.1.1]/9
          template<typename _InputIterator>
            void
            _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
                   __false_type);
    
          // Called by assign(n,t), and the range assign when it turns out
          // to be the same thing.
          void
          _M_fill_assign(size_type __n, const value_type& __val);
    
    
          // Moves the elements from [first,last) before position.
          void
          _M_transfer(iterator __position, iterator __first, iterator __last)
          { __position._M_node->transfer(__first._M_node, __last._M_node); }
    
          // Inserts new element at position given and with value given.
    #ifndef __GXX_EXPERIMENTAL_CXX0X__
          void
          _M_insert(iterator __position, const value_type& __x)
          {
            _Node* __tmp = _M_create_node(__x);
            __tmp->hook(__position._M_node);
          }
    #else
         template<typename... _Args>
           void
           _M_insert(iterator __position, _Args&&... __args)
           {
         _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
         __tmp->hook(__position._M_node);
           }
    #endif
    
          // Erases element at position given.
          void
          _M_erase(iterator __position)
          {
            __position._M_node->unhook();
            _Node* __n = static_cast<_Node*>(__position._M_node);
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
            _M_get_Node_allocator().destroy(__n);
    #else
        _M_get_Tp_allocator().destroy(&__n->_M_data);
    #endif
            _M_put_node(__n);
          }
    
          // To implement the splice (and merge) bits of N1599.
          void
          _M_check_equal_allocators(list& __x)
          {
        if (std::__alloc_neq<typename _Base::_Node_alloc_type>::
            _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator()))
          __throw_runtime_error(__N("list::_M_check_equal_allocators"));
          }
        };
    
      /**
       *  @brief  List equality comparison.
       *  @param  x  A %list.
       *  @param  y  A %list of the same type as @a x.
       *  @return  True iff the size and elements of the lists are equal.
       *
       *  This is an equivalence relation.  It is linear in the size of
       *  the lists.  Lists are considered equivalent if their sizes are
       *  equal, and if corresponding elements compare equal.
      */
      template<typename _Tp, typename _Alloc>
        inline bool
        operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
        {
          typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
          const_iterator __end1 = __x.end();
          const_iterator __end2 = __y.end();
    
          const_iterator __i1 = __x.begin();
          const_iterator __i2 = __y.begin();
          while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2)
        {
          ++__i1;
          ++__i2;
        }
          return __i1 == __end1 && __i2 == __end2;
        }
    
      /**
       *  @brief  List ordering relation.
       *  @param  x  A %list.
       *  @param  y  A %list of the same type as @a x.
       *  @return  True iff @a x is lexicographically less than @a y.
       *
       *  This is a total ordering relation.  It is linear in the size of the
       *  lists.  The elements must be comparable with @c <.
       *
       *  See std::lexicographical_compare() for how the determination is made.
      */
      template<typename _Tp, typename _Alloc>
        inline bool
        operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
        { return std::lexicographical_compare(__x.begin(), __x.end(),
                          __y.begin(), __y.end()); }
    
      /// Based on operator==
      template<typename _Tp, typename _Alloc>
        inline bool
        operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
        { return !(__x == __y); }
    
      /// Based on operator<
      template<typename _Tp, typename _Alloc>
        inline bool
        operator>(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
        { return __y < __x; }
    
      /// Based on operator<
      template<typename _Tp, typename _Alloc>
        inline bool
        operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
        { return !(__y < __x); }
    
      /// Based on operator<
      template<typename _Tp, typename _Alloc>
        inline bool
        operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
        { return !(__x < __y); }
    
      /// See std::list::swap().
      template<typename _Tp, typename _Alloc>
        inline void
        swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
        { __x.swap(__y); }
    
    #ifdef __GXX_EXPERIMENTAL_CXX0X__
      template<typename _Tp, typename _Alloc>
        inline void
        swap(list<_Tp, _Alloc>&& __x, list<_Tp, _Alloc>& __y)
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Alloc>
        inline void
        swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>&& __y)
        { __x.swap(__y); }
    #endif
    
    _GLIBCXX_END_NESTED_NAMESPACE
    
    #endif /* _STL_LIST_H */
  • 相关阅读:
    [levelDB] Version Manager
    [levelDB] Compaction
    <Effective Modern C++> 读书笔记
    <Effective Modern C++> 笔记-1-Deducing Type
    水塘抽样(Reservoir Sampling)问题
    【C++工程实践】条件变量
    【c++工程实践】内存模型
    【c++工程实践】智能指针
    【c++工程实践】值语义与右值引用
    分布式系统原理-CAP/2PC/3PC
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2440622.html
Copyright © 2011-2022 走看看