Home | History | Annotate | Download | only in bits
      1 // Vector implementation -*- C++ -*-
      2 
      3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
      4 // 2011 Free Software Foundation, Inc.
      5 //
      6 // This file is part of the GNU ISO C++ Library.  This library is free
      7 // software; you can redistribute it and/or modify it under the
      8 // terms of the GNU General Public License as published by the
      9 // Free Software Foundation; either version 3, or (at your option)
     10 // any later version.
     11 
     12 // This library is distributed in the hope that it will be useful,
     13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 // GNU General Public License for more details.
     16 
     17 // Under Section 7 of GPL version 3, you are granted additional
     18 // permissions described in the GCC Runtime Library Exception, version
     19 // 3.1, as published by the Free Software Foundation.
     20 
     21 // You should have received a copy of the GNU General Public License and
     22 // a copy of the GCC Runtime Library Exception along with this program;
     23 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24 // <http://www.gnu.org/licenses/>.
     25 
     26 /*
     27  *
     28  * Copyright (c) 1994
     29  * Hewlett-Packard Company
     30  *
     31  * Permission to use, copy, modify, distribute and sell this software
     32  * and its documentation for any purpose is hereby granted without fee,
     33  * provided that the above copyright notice appear in all copies and
     34  * that both that copyright notice and this permission notice appear
     35  * in supporting documentation.  Hewlett-Packard Company makes no
     36  * representations about the suitability of this software for any
     37  * purpose.  It is provided "as is" without express or implied warranty.
     38  *
     39  *
     40  * Copyright (c) 1996
     41  * Silicon Graphics Computer Systems, Inc.
     42  *
     43  * Permission to use, copy, modify, distribute and sell this software
     44  * and its documentation for any purpose is hereby granted without fee,
     45  * provided that the above copyright notice appear in all copies and
     46  * that both that copyright notice and this permission notice appear
     47  * in supporting documentation.  Silicon Graphics makes no
     48  * representations about the suitability of this  software for any
     49  * purpose.  It is provided "as is" without express or implied warranty.
     50  */
     51 
     52 /** @file bits/stl_vector.h
     53  *  This is an internal header file, included by other library headers.
     54  *  Do not attempt to use it directly. @headername{vector}
     55  */
     56 
     57 #ifndef _STL_VECTOR_H
     58 #define _STL_VECTOR_H 1
     59 
     60 #include <bits/stl_iterator_base_funcs.h>
     61 #include <bits/functexcept.h>
     62 #include <bits/concept_check.h>
     63 #include <initializer_list>
     64 
     65 namespace std _GLIBCXX_VISIBILITY(default)
     66 {
     67 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     68 
     69   /// See bits/stl_deque.h's _Deque_base for an explanation.
     70   template<typename _Tp, typename _Alloc>
     71     struct _Vector_base
     72     {
     73       typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
     74 
     75       struct _Vector_impl
     76       : public _Tp_alloc_type
     77       {
     78 	typename _Tp_alloc_type::pointer _M_start;
     79 	typename _Tp_alloc_type::pointer _M_finish;
     80 	typename _Tp_alloc_type::pointer _M_end_of_storage;
     81 
     82 	_Vector_impl()
     83 	: _Tp_alloc_type(), _M_start(0), _M_finish(0), _M_end_of_storage(0)
     84 	{ }
     85 
     86 	_Vector_impl(_Tp_alloc_type const& __a)
     87 	: _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
     88 	{ }
     89       };
     90 
     91     public:
     92       typedef _Alloc allocator_type;
     93 
     94       _Tp_alloc_type&
     95       _M_get_Tp_allocator()
     96       { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }
     97 
     98       const _Tp_alloc_type&
     99       _M_get_Tp_allocator() const
    100       { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }
    101 
    102       allocator_type
    103       get_allocator() const
    104       { return allocator_type(_M_get_Tp_allocator()); }
    105 
    106       _Vector_base()
    107       : _M_impl() { }
    108 
    109       _Vector_base(const allocator_type& __a)
    110       : _M_impl(__a) { }
    111 
    112       _Vector_base(size_t __n)
    113       : _M_impl()
    114       {
    115 	this->_M_impl._M_start = this->_M_allocate(__n);
    116 	this->_M_impl._M_finish = this->_M_impl._M_start;
    117 	this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
    118       }
    119 
    120       _Vector_base(size_t __n, const allocator_type& __a)
    121       : _M_impl(__a)
    122       {
    123 	this->_M_impl._M_start = this->_M_allocate(__n);
    124 	this->_M_impl._M_finish = this->_M_impl._M_start;
    125 	this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
    126       }
    127 
    128 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    129       _Vector_base(_Vector_base&& __x)
    130       : _M_impl(__x._M_get_Tp_allocator())
    131       {
    132 	this->_M_impl._M_start = __x._M_impl._M_start;
    133 	this->_M_impl._M_finish = __x._M_impl._M_finish;
    134 	this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage;
    135 	__x._M_impl._M_start = 0;
    136 	__x._M_impl._M_finish = 0;
    137 	__x._M_impl._M_end_of_storage = 0;
    138       }
    139 #endif
    140 
    141       ~_Vector_base()
    142       { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
    143 		      - this->_M_impl._M_start); }
    144 
    145     public:
    146       _Vector_impl _M_impl;
    147 
    148       typename _Tp_alloc_type::pointer
    149       _M_allocate(size_t __n)
    150       { return __n != 0 ? _M_impl.allocate(__n) : 0; }
    151 
    152       void
    153       _M_deallocate(typename _Tp_alloc_type::pointer __p, size_t __n)
    154       {
    155 	if (__p)
    156 	  _M_impl.deallocate(__p, __n);
    157       }
    158     };
    159 
    160 
    161   /**
    162    *  @brief A standard container which offers fixed time access to
    163    *  individual elements in any order.
    164    *
    165    *  @ingroup sequences
    166    *
    167    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
    168    *  <a href="tables.html#66">reversible container</a>, and a
    169    *  <a href="tables.html#67">sequence</a>, including the
    170    *  <a href="tables.html#68">optional sequence requirements</a> with the
    171    *  %exception of @c push_front and @c pop_front.
    172    *
    173    *  In some terminology a %vector can be described as a dynamic
    174    *  C-style array, it offers fast and efficient access to individual
    175    *  elements in any order and saves the user from worrying about
    176    *  memory and size allocation.  Subscripting ( @c [] ) access is
    177    *  also provided as with C-style arrays.
    178   */
    179   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
    180     class vector : protected _Vector_base<_Tp, _Alloc>
    181     {
    182       // Concept requirements.
    183       typedef typename _Alloc::value_type                _Alloc_value_type;
    184       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
    185       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
    186 
    187       typedef _Vector_base<_Tp, _Alloc>			 _Base;
    188       typedef typename _Base::_Tp_alloc_type		 _Tp_alloc_type;
    189 
    190     public:
    191       typedef _Tp					 value_type;
    192       typedef typename _Tp_alloc_type::pointer           pointer;
    193       typedef typename _Tp_alloc_type::const_pointer     const_pointer;
    194       typedef typename _Tp_alloc_type::reference         reference;
    195       typedef typename _Tp_alloc_type::const_reference   const_reference;
    196       typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
    197       typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
    198       const_iterator;
    199       typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
    200       typedef std::reverse_iterator<iterator>		 reverse_iterator;
    201       typedef size_t					 size_type;
    202       typedef ptrdiff_t					 difference_type;
    203       typedef _Alloc                        		 allocator_type;
    204 
    205     protected:
    206       using _Base::_M_allocate;
    207       using _Base::_M_deallocate;
    208       using _Base::_M_impl;
    209       using _Base::_M_get_Tp_allocator;
    210 
    211       bool _M_is_valid() const
    212       {
    213         return (this->_M_impl._M_end_of_storage == 0
    214 		&& this->_M_impl._M_start == 0
    215 		&& this->_M_impl._M_finish == 0)
    216 	      || (this->_M_impl._M_start <= this->_M_impl._M_finish
    217 		  && this->_M_impl._M_finish <= this->_M_impl._M_end_of_storage
    218 		  && this->_M_impl._M_start < this->_M_impl._M_end_of_storage);
    219       }
    220 
    221     public:
    222       // [23.2.4.1] construct/copy/destroy
    223       // (assign() and get_allocator() are also listed in this section)
    224       /**
    225        *  @brief  Default constructor creates no elements.
    226        */
    227       vector()
    228       : _Base() { }
    229 
    230       /**
    231        *  @brief  Creates a %vector with no elements.
    232        *  @param  a  An allocator object.
    233        */
    234       explicit
    235       vector(const allocator_type& __a)
    236       : _Base(__a) { }
    237 
    238 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    239       /**
    240        *  @brief  Creates a %vector with default constructed elements.
    241        *  @param  n  The number of elements to initially create.
    242        *
    243        *  This constructor fills the %vector with @a n default
    244        *  constructed elements.
    245        */
    246       explicit
    247       vector(size_type __n)
    248       : _Base(__n)
    249       { _M_default_initialize(__n); }
    250 
    251       /**
    252        *  @brief  Creates a %vector with copies of an exemplar element.
    253        *  @param  n  The number of elements to initially create.
    254        *  @param  value  An element to copy.
    255        *  @param  a  An allocator.
    256        *
    257        *  This constructor fills the %vector with @a n copies of @a value.
    258        */
    259       vector(size_type __n, const value_type& __value,
    260 	     const allocator_type& __a = allocator_type())
    261       : _Base(__n, __a)
    262       { _M_fill_initialize(__n, __value); }
    263 #else
    264       /**
    265        *  @brief  Creates a %vector with copies of an exemplar element.
    266        *  @param  n  The number of elements to initially create.
    267        *  @param  value  An element to copy.
    268        *  @param  a  An allocator.
    269        *
    270        *  This constructor fills the %vector with @a n copies of @a value.
    271        */
    272       explicit
    273       vector(size_type __n, const value_type& __value = value_type(),
    274 	     const allocator_type& __a = allocator_type())
    275       : _Base(__n, __a)
    276       { _M_fill_initialize(__n, __value); }
    277 #endif
    278 
    279       /**
    280        *  @brief  %Vector copy constructor.
    281        *  @param  x  A %vector of identical element and allocator types.
    282        *
    283        *  The newly-created %vector uses a copy of the allocation
    284        *  object used by @a x.  All the elements of @a x are copied,
    285        *  but any extra memory in
    286        *  @a x (for fast expansion) will not be copied.
    287        */
    288       vector(const vector& __x)
    289       : _Base(__x.size(), __x._M_get_Tp_allocator())
    290       { this->_M_impl._M_finish =
    291 	  std::__uninitialized_copy_a(__x.begin(), __x.end(),
    292 				      this->_M_impl._M_start,
    293 				      _M_get_Tp_allocator());
    294       }
    295 
    296 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    297       /**
    298        *  @brief  %Vector move constructor.
    299        *  @param  x  A %vector of identical element and allocator types.
    300        *
    301        *  The newly-created %vector contains the exact contents of @a x.
    302        *  The contents of @a x are a valid, but unspecified %vector.
    303        */
    304       vector(vector&& __x)
    305       : _Base(std::move(__x)) { }
    306 
    307       /**
    308        *  @brief  Builds a %vector from an initializer list.
    309        *  @param  l  An initializer_list.
    310        *  @param  a  An allocator.
    311        *
    312        *  Create a %vector consisting of copies of the elements in the
    313        *  initializer_list @a l.
    314        *
    315        *  This will call the element type's copy constructor N times
    316        *  (where N is @a l.size()) and do no memory reallocation.
    317        */
    318       vector(initializer_list<value_type> __l,
    319 	     const allocator_type& __a = allocator_type())
    320       : _Base(__a)
    321       {
    322 	_M_range_initialize(__l.begin(), __l.end(),
    323 			    random_access_iterator_tag());
    324       }
    325 #endif
    326 
    327       /**
    328        *  @brief  Builds a %vector from a range.
    329        *  @param  first  An input iterator.
    330        *  @param  last  An input iterator.
    331        *  @param  a  An allocator.
    332        *
    333        *  Create a %vector consisting of copies of the elements from
    334        *  [first,last).
    335        *
    336        *  If the iterators are forward, bidirectional, or
    337        *  random-access, then this will call the elements' copy
    338        *  constructor N times (where N is distance(first,last)) and do
    339        *  no memory reallocation.  But if only input iterators are
    340        *  used, then this will do at most 2N calls to the copy
    341        *  constructor, and logN memory reallocations.
    342        */
    343       template<typename _InputIterator>
    344         vector(_InputIterator __first, _InputIterator __last,
    345 	       const allocator_type& __a = allocator_type())
    346 	: _Base(__a)
    347         {
    348 	  // Check whether it's an integral type.  If so, it's not an iterator.
    349 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    350 	  _M_initialize_dispatch(__first, __last, _Integral());
    351 	}
    352 
    353       /**
    354        *  The dtor only erases the elements, and note that if the
    355        *  elements themselves are pointers, the pointed-to memory is
    356        *  not touched in any way.  Managing the pointer is the user's
    357        *  responsibility.
    358        */
    359       ~vector()
    360       { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
    361 		      _M_get_Tp_allocator()); }
    362 
    363       /**
    364        *  @brief  %Vector assignment operator.
    365        *  @param  x  A %vector of identical element and allocator types.
    366        *
    367        *  All the elements of @a x are copied, but any extra memory in
    368        *  @a x (for fast expansion) will not be copied.  Unlike the
    369        *  copy constructor, the allocator object is not copied.
    370        */
    371       vector&
    372       operator=(const vector& __x);
    373 
    374 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    375       /**
    376        *  @brief  %Vector move assignment operator.
    377        *  @param  x  A %vector of identical element and allocator types.
    378        *
    379        *  The contents of @a x are moved into this %vector (without copying).
    380        *  @a x is a valid, but unspecified %vector.
    381        */
    382       vector&
    383       operator=(vector&& __x)
    384       {
    385 	// NB: DR 1204.
    386 	// NB: DR 675.
    387 	this->clear();
    388 	this->swap(__x);
    389 	return *this;
    390       }
    391 
    392       /**
    393        *  @brief  %Vector list assignment operator.
    394        *  @param  l  An initializer_list.
    395        *
    396        *  This function fills a %vector with copies of the elements in the
    397        *  initializer list @a l.
    398        *
    399        *  Note that the assignment completely changes the %vector and
    400        *  that the resulting %vector's size is the same as the number
    401        *  of elements assigned.  Old data may be lost.
    402        */
    403       vector&
    404       operator=(initializer_list<value_type> __l)
    405       {
    406 	this->assign(__l.begin(), __l.end());
    407 	return *this;
    408       }
    409 #endif
    410 
    411       /**
    412        *  @brief  Assigns a given value to a %vector.
    413        *  @param  n  Number of elements to be assigned.
    414        *  @param  val  Value to be assigned.
    415        *
    416        *  This function fills a %vector with @a n copies of the given
    417        *  value.  Note that the assignment completely changes the
    418        *  %vector and that the resulting %vector's size is the same as
    419        *  the number of elements assigned.  Old data may be lost.
    420        */
    421       void
    422       assign(size_type __n, const value_type& __val)
    423       { _M_fill_assign(__n, __val); }
    424 
    425       /**
    426        *  @brief  Assigns a range to a %vector.
    427        *  @param  first  An input iterator.
    428        *  @param  last   An input iterator.
    429        *
    430        *  This function fills a %vector with copies of the elements in the
    431        *  range [first,last).
    432        *
    433        *  Note that the assignment completely changes the %vector and
    434        *  that the resulting %vector's size is the same as the number
    435        *  of elements assigned.  Old data may be lost.
    436        */
    437       template<typename _InputIterator>
    438         void
    439         assign(_InputIterator __first, _InputIterator __last)
    440         {
    441 	  // Check whether it's an integral type.  If so, it's not an iterator.
    442 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    443 	  _M_assign_dispatch(__first, __last, _Integral());
    444 	}
    445 
    446 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    447       /**
    448        *  @brief  Assigns an initializer list to a %vector.
    449        *  @param  l  An initializer_list.
    450        *
    451        *  This function fills a %vector with copies of the elements in the
    452        *  initializer list @a l.
    453        *
    454        *  Note that the assignment completely changes the %vector and
    455        *  that the resulting %vector's size is the same as the number
    456        *  of elements assigned.  Old data may be lost.
    457        */
    458       void
    459       assign(initializer_list<value_type> __l)
    460       { this->assign(__l.begin(), __l.end()); }
    461 #endif
    462 
    463       /// Get a copy of the memory allocation object.
    464       using _Base::get_allocator;
    465 
    466       // iterators
    467       /**
    468        *  Returns a read/write iterator that points to the first
    469        *  element in the %vector.  Iteration is done in ordinary
    470        *  element order.
    471        */
    472       iterator
    473       begin()
    474       {
    475 #if __google_stl_debug_dangling_vector
    476         if (!this->_M_is_valid())
    477           __throw_logic_error("begin() on corrupt (dangling?) vector");
    478 #endif
    479 	return iterator(this->_M_impl._M_start);
    480       }
    481 
    482       /**
    483        *  Returns a read-only (constant) iterator that points to the
    484        *  first element in the %vector.  Iteration is done in ordinary
    485        *  element order.
    486        */
    487       const_iterator
    488       begin() const
    489       {
    490 #if __google_stl_debug_dangling_vector
    491         if (!this->_M_is_valid())
    492           __throw_logic_error("begin() on corrupt (dangling?) vector");
    493 #endif
    494 	return const_iterator(this->_M_impl._M_start);
    495       }
    496 
    497       /**
    498        *  Returns a read/write iterator that points one past the last
    499        *  element in the %vector.  Iteration is done in ordinary
    500        *  element order.
    501        */
    502       iterator
    503       end()
    504       {
    505 #if __google_stl_debug_dangling_vector
    506         if (!this->_M_is_valid())
    507           __throw_logic_error("end() on corrupt (dangling?) vector");
    508 #endif
    509 	return iterator(this->_M_impl._M_finish);
    510       }
    511 
    512       /**
    513        *  Returns a read-only (constant) iterator that points one past
    514        *  the last element in the %vector.  Iteration is done in
    515        *  ordinary element order.
    516        */
    517       const_iterator
    518       end() const
    519       {
    520 #if __google_stl_debug_dangling_vector
    521         if (!this->_M_is_valid())
    522           __throw_logic_error("end() on corrupt (dangling?) vector");
    523 #endif
    524 	return const_iterator(this->_M_impl._M_finish);
    525       }
    526 
    527       /**
    528        *  Returns a read/write reverse iterator that points to the
    529        *  last element in the %vector.  Iteration is done in reverse
    530        *  element order.
    531        */
    532       reverse_iterator
    533       rbegin()
    534       { return reverse_iterator(end()); }
    535 
    536       /**
    537        *  Returns a read-only (constant) reverse iterator that points
    538        *  to the last element in the %vector.  Iteration is done in
    539        *  reverse element order.
    540        */
    541       const_reverse_iterator
    542       rbegin() const
    543       { return const_reverse_iterator(end()); }
    544 
    545       /**
    546        *  Returns a read/write reverse iterator that points to one
    547        *  before the first element in the %vector.  Iteration is done
    548        *  in reverse element order.
    549        */
    550       reverse_iterator
    551       rend()
    552       { return reverse_iterator(begin()); }
    553 
    554       /**
    555        *  Returns a read-only (constant) reverse iterator that points
    556        *  to one before the first element in the %vector.  Iteration
    557        *  is done in reverse element order.
    558        */
    559       const_reverse_iterator
    560       rend() const
    561       { return const_reverse_iterator(begin()); }
    562 
    563 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    564       /**
    565        *  Returns a read-only (constant) iterator that points to the
    566        *  first element in the %vector.  Iteration is done in ordinary
    567        *  element order.
    568        */
    569       const_iterator
    570       cbegin() const
    571       { return const_iterator(this->_M_impl._M_start); }
    572 
    573       /**
    574        *  Returns a read-only (constant) iterator that points one past
    575        *  the last element in the %vector.  Iteration is done in
    576        *  ordinary element order.
    577        */
    578       const_iterator
    579       cend() const
    580       { return const_iterator(this->_M_impl._M_finish); }
    581 
    582       /**
    583        *  Returns a read-only (constant) reverse iterator that points
    584        *  to the last element in the %vector.  Iteration is done in
    585        *  reverse element order.
    586        */
    587       const_reverse_iterator
    588       crbegin() const
    589       { return const_reverse_iterator(end()); }
    590 
    591       /**
    592        *  Returns a read-only (constant) reverse iterator that points
    593        *  to one before the first element in the %vector.  Iteration
    594        *  is done in reverse element order.
    595        */
    596       const_reverse_iterator
    597       crend() const
    598       { return const_reverse_iterator(begin()); }
    599 #endif
    600 
    601       // [23.2.4.2] capacity
    602       /**  Returns the number of elements in the %vector.  */
    603       size_type
    604       size() const
    605       {
    606 #if __google_stl_debug_dangling_vector
    607         if (!this->_M_is_valid())
    608           __throw_logic_error("size() on corrupt (dangling?) vector");
    609 #endif
    610 	return size_type(this->_M_impl._M_finish - this->_M_impl._M_start);
    611       }
    612 
    613       /**  Returns the size() of the largest possible %vector.  */
    614       size_type
    615       max_size() const
    616       { return _M_get_Tp_allocator().max_size(); }
    617 
    618 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    619       /**
    620        *  @brief  Resizes the %vector to the specified number of elements.
    621        *  @param  new_size  Number of elements the %vector should contain.
    622        *
    623        *  This function will %resize the %vector to the specified
    624        *  number of elements.  If the number is smaller than the
    625        *  %vector's current size the %vector is truncated, otherwise
    626        *  default constructed elements are appended.
    627        */
    628       void
    629       resize(size_type __new_size)
    630       {
    631 	if (__new_size > size())
    632 	  _M_default_append(__new_size - size());
    633 	else if (__new_size < size())
    634 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
    635       }
    636 
    637       /**
    638        *  @brief  Resizes the %vector to the specified number of elements.
    639        *  @param  new_size  Number of elements the %vector should contain.
    640        *  @param  x  Data with which new elements should be populated.
    641        *
    642        *  This function will %resize the %vector to the specified
    643        *  number of elements.  If the number is smaller than the
    644        *  %vector's current size the %vector is truncated, otherwise
    645        *  the %vector is extended and new elements are populated with
    646        *  given data.
    647        */
    648       void
    649       resize(size_type __new_size, const value_type& __x)
    650       {
    651 	if (__new_size > size())
    652 	  insert(end(), __new_size - size(), __x);
    653 	else if (__new_size < size())
    654 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
    655       }
    656 #else
    657       /**
    658        *  @brief  Resizes the %vector to the specified number of elements.
    659        *  @param  new_size  Number of elements the %vector should contain.
    660        *  @param  x  Data with which new elements should be populated.
    661        *
    662        *  This function will %resize the %vector to the specified
    663        *  number of elements.  If the number is smaller than the
    664        *  %vector's current size the %vector is truncated, otherwise
    665        *  the %vector is extended and new elements are populated with
    666        *  given data.
    667        */
    668       void
    669       resize(size_type __new_size, value_type __x = value_type())
    670       {
    671 	if (__new_size > size())
    672 	  insert(end(), __new_size - size(), __x);
    673 	else if (__new_size < size())
    674 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
    675       }
    676 #endif
    677 
    678 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    679       /**  A non-binding request to reduce capacity() to size().  */
    680       void
    681       shrink_to_fit()
    682       { std::__shrink_to_fit<vector>::_S_do_it(*this); }
    683 #endif
    684 
    685       /**
    686        *  Returns the total number of elements that the %vector can
    687        *  hold before needing to allocate more memory.
    688        */
    689       size_type
    690       capacity() const
    691       {
    692 #if __google_stl_debug_dangling_vector
    693         if (!this->_M_is_valid())
    694           __throw_logic_error("capacity() on corrupt (dangling?) vector");
    695 #endif
    696 	return size_type(this->_M_impl._M_end_of_storage
    697 			 - this->_M_impl._M_start); }
    698 
    699       /**
    700        *  Returns true if the %vector is empty.  (Thus begin() would
    701        *  equal end().)
    702        */
    703       bool
    704       empty() const
    705       { return begin() == end(); }
    706 
    707       /**
    708        *  @brief  Attempt to preallocate enough memory for specified number of
    709        *          elements.
    710        *  @param  n  Number of elements required.
    711        *  @throw  std::length_error  If @a n exceeds @c max_size().
    712        *
    713        *  This function attempts to reserve enough memory for the
    714        *  %vector to hold the specified number of elements.  If the
    715        *  number requested is more than max_size(), length_error is
    716        *  thrown.
    717        *
    718        *  The advantage of this function is that if optimal code is a
    719        *  necessity and the user can determine the number of elements
    720        *  that will be required, the user can reserve the memory in
    721        *  %advance, and thus prevent a possible reallocation of memory
    722        *  and copying of %vector data.
    723        */
    724       void
    725       reserve(size_type __n);
    726 
    727       // element access
    728       /**
    729        *  @brief  Subscript access to the data contained in the %vector.
    730        *  @param n The index of the element for which data should be
    731        *  accessed.
    732        *  @return  Read/write reference to data.
    733        *
    734        *  This operator allows for easy, array-style, data access.
    735        *  Note that data access with this operator is unchecked and
    736        *  out_of_range lookups are not defined. (For checked lookups
    737        *  see at().)
    738        *
    739        *  Local modification: range checks are performed if
    740        *  __google_stl_debug_vector is defined to non-zero.
    741        */
    742       reference
    743       operator[](size_type __n)
    744       {
    745 #if __google_stl_debug_vector
    746 	_M_range_check(__n);
    747 #endif
    748 	return *(this->_M_impl._M_start + __n);
    749       }
    750 
    751       /**
    752        *  @brief  Subscript access to the data contained in the %vector.
    753        *  @param n The index of the element for which data should be
    754        *  accessed.
    755        *  @return  Read-only (constant) reference to data.
    756        *
    757        *  This operator allows for easy, array-style, data access.
    758        *  Note that data access with this operator is unchecked and
    759        *  out_of_range lookups are not defined. (For checked lookups
    760        *  see at().)
    761        *
    762        *  Local modification: range checks are performed if
    763        *  __google_stl_debug_vector is defined to non-zero.
    764        */
    765       const_reference
    766       operator[](size_type __n) const
    767       {
    768 #if __google_stl_debug_vector
    769 	_M_range_check(__n);
    770 #endif
    771 	return *(this->_M_impl._M_start + __n);
    772       }
    773 
    774     protected:
    775       /// Safety check used only from at().
    776       void
    777       _M_range_check(size_type __n) const
    778       {
    779 	if (__n >= this->size())
    780 	  __throw_out_of_range(__N("vector::_M_range_check"));
    781       }
    782 
    783     public:
    784       /**
    785        *  @brief  Provides access to the data contained in the %vector.
    786        *  @param n The index of the element for which data should be
    787        *  accessed.
    788        *  @return  Read/write reference to data.
    789        *  @throw  std::out_of_range  If @a n is an invalid index.
    790        *
    791        *  This function provides for safer data access.  The parameter
    792        *  is first checked that it is in the range of the vector.  The
    793        *  function throws out_of_range if the check fails.
    794        */
    795       reference
    796       at(size_type __n)
    797       {
    798 	_M_range_check(__n);
    799 	return (*this)[__n];
    800       }
    801 
    802       /**
    803        *  @brief  Provides access to the data contained in the %vector.
    804        *  @param n The index of the element for which data should be
    805        *  accessed.
    806        *  @return  Read-only (constant) reference to data.
    807        *  @throw  std::out_of_range  If @a n is an invalid index.
    808        *
    809        *  This function provides for safer data access.  The parameter
    810        *  is first checked that it is in the range of the vector.  The
    811        *  function throws out_of_range if the check fails.
    812        */
    813       const_reference
    814       at(size_type __n) const
    815       {
    816 	_M_range_check(__n);
    817 	return (*this)[__n];
    818       }
    819 
    820       /**
    821        *  Returns a read/write reference to the data at the first
    822        *  element of the %vector.
    823        */
    824       reference
    825       front()
    826       { return *begin(); }
    827 
    828       /**
    829        *  Returns a read-only (constant) reference to the data at the first
    830        *  element of the %vector.
    831        */
    832       const_reference
    833       front() const
    834       { return *begin(); }
    835 
    836       /**
    837        *  Returns a read/write reference to the data at the last
    838        *  element of the %vector.
    839        */
    840       reference
    841       back()
    842       { return *(end() - 1); }
    843 
    844       /**
    845        *  Returns a read-only (constant) reference to the data at the
    846        *  last element of the %vector.
    847        */
    848       const_reference
    849       back() const
    850       { return *(end() - 1); }
    851 
    852       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    853       // DR 464. Suggestion for new member functions in standard containers.
    854       // data access
    855       /**
    856        *   Returns a pointer such that [data(), data() + size()) is a valid
    857        *   range.  For a non-empty %vector, data() == &front().
    858        */
    859 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    860       _Tp*
    861 #else
    862       pointer
    863 #endif
    864       data()
    865       { return std::__addressof(front()); }
    866 
    867 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    868       const _Tp*
    869 #else
    870       const_pointer
    871 #endif
    872       data() const
    873       { return std::__addressof(front()); }
    874 
    875       // [23.2.4.3] modifiers
    876       /**
    877        *  @brief  Add data to the end of the %vector.
    878        *  @param  x  Data to be added.
    879        *
    880        *  This is a typical stack operation.  The function creates an
    881        *  element at the end of the %vector and assigns the given data
    882        *  to it.  Due to the nature of a %vector this operation can be
    883        *  done in constant time if the %vector has preallocated space
    884        *  available.
    885        */
    886       void
    887       push_back(const value_type& __x)
    888       {
    889 	if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
    890 	  {
    891 	    this->_M_impl.construct(this->_M_impl._M_finish, __x);
    892 	    ++this->_M_impl._M_finish;
    893 	  }
    894 	else
    895 	  _M_insert_aux(end(), __x);
    896       }
    897 
    898 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    899       void
    900       push_back(value_type&& __x)
    901       { emplace_back(std::move(__x)); }
    902 
    903       template<typename... _Args>
    904         void
    905         emplace_back(_Args&&... __args);
    906 #endif
    907 
    908       /**
    909        *  @brief  Removes last element.
    910        *
    911        *  This is a typical stack operation. It shrinks the %vector by one.
    912        *
    913        *  Note that no data is returned, and if the last element's
    914        *  data is needed, it should be retrieved before pop_back() is
    915        *  called.
    916        */
    917       void
    918       pop_back()
    919       {
    920 	--this->_M_impl._M_finish;
    921 	this->_M_impl.destroy(this->_M_impl._M_finish);
    922       }
    923 
    924 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    925       /**
    926        *  @brief  Inserts an object in %vector before specified iterator.
    927        *  @param  position  An iterator into the %vector.
    928        *  @param  args  Arguments.
    929        *  @return  An iterator that points to the inserted data.
    930        *
    931        *  This function will insert an object of type T constructed
    932        *  with T(std::forward<Args>(args)...) before the specified location.
    933        *  Note that this kind of operation could be expensive for a %vector
    934        *  and if it is frequently used the user should consider using
    935        *  std::list.
    936        */
    937       template<typename... _Args>
    938         iterator
    939         emplace(iterator __position, _Args&&... __args);
    940 #endif
    941 
    942       /**
    943        *  @brief  Inserts given value into %vector before specified iterator.
    944        *  @param  position  An iterator into the %vector.
    945        *  @param  x  Data to be inserted.
    946        *  @return  An iterator that points to the inserted data.
    947        *
    948        *  This function will insert a copy of the given value before
    949        *  the specified location.  Note that this kind of operation
    950        *  could be expensive for a %vector and if it is frequently
    951        *  used the user should consider using std::list.
    952        */
    953       iterator
    954       insert(iterator __position, const value_type& __x);
    955 
    956 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    957       /**
    958        *  @brief  Inserts given rvalue into %vector before specified iterator.
    959        *  @param  position  An iterator into the %vector.
    960        *  @param  x  Data to be inserted.
    961        *  @return  An iterator that points to the inserted data.
    962        *
    963        *  This function will insert a copy of the given rvalue before
    964        *  the specified location.  Note that this kind of operation
    965        *  could be expensive for a %vector and if it is frequently
    966        *  used the user should consider using std::list.
    967        */
    968       iterator
    969       insert(iterator __position, value_type&& __x)
    970       { return emplace(__position, std::move(__x)); }
    971 
    972       /**
    973        *  @brief  Inserts an initializer_list into the %vector.
    974        *  @param  position  An iterator into the %vector.
    975        *  @param  l  An initializer_list.
    976        *
    977        *  This function will insert copies of the data in the
    978        *  initializer_list @a l into the %vector before the location
    979        *  specified by @a position.
    980        *
    981        *  Note that this kind of operation could be expensive for a
    982        *  %vector and if it is frequently used the user should
    983        *  consider using std::list.
    984        */
    985       void
    986       insert(iterator __position, initializer_list<value_type> __l)
    987       { this->insert(__position, __l.begin(), __l.end()); }
    988 #endif
    989 
    990       /**
    991        *  @brief  Inserts a number of copies of given data into the %vector.
    992        *  @param  position  An iterator into the %vector.
    993        *  @param  n  Number of elements to be inserted.
    994        *  @param  x  Data to be inserted.
    995        *
    996        *  This function will insert a specified number of copies of
    997        *  the given data before the location specified by @a position.
    998        *
    999        *  Note that this kind of operation could be expensive for a
   1000        *  %vector and if it is frequently used the user should
   1001        *  consider using std::list.
   1002        */
   1003       void
   1004       insert(iterator __position, size_type __n, const value_type& __x)
   1005       { _M_fill_insert(__position, __n, __x); }
   1006 
   1007       /**
   1008        *  @brief  Inserts a range into the %vector.
   1009        *  @param  position  An iterator into the %vector.
   1010        *  @param  first  An input iterator.
   1011        *  @param  last   An input iterator.
   1012        *
   1013        *  This function will insert copies of the data in the range
   1014        *  [first,last) into the %vector before the location specified
   1015        *  by @a pos.
   1016        *
   1017        *  Note that this kind of operation could be expensive for a
   1018        *  %vector and if it is frequently used the user should
   1019        *  consider using std::list.
   1020        */
   1021       template<typename _InputIterator>
   1022         void
   1023         insert(iterator __position, _InputIterator __first,
   1024 	       _InputIterator __last)
   1025         {
   1026 	  // Check whether it's an integral type.  If so, it's not an iterator.
   1027 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
   1028 	  _M_insert_dispatch(__position, __first, __last, _Integral());
   1029 	}
   1030 
   1031       /**
   1032        *  @brief  Remove element at given position.
   1033        *  @param  position  Iterator pointing to element to be erased.
   1034        *  @return  An iterator pointing to the next element (or end()).
   1035        *
   1036        *  This function will erase the element at the given position and thus
   1037        *  shorten the %vector by one.
   1038        *
   1039        *  Note This operation could be expensive and if it is
   1040        *  frequently used the user should consider using std::list.
   1041        *  The user is also cautioned that this function only erases
   1042        *  the element, and that if the element is itself a pointer,
   1043        *  the pointed-to memory is not touched in any way.  Managing
   1044        *  the pointer is the user's responsibility.
   1045        */
   1046       iterator
   1047       erase(iterator __position);
   1048 
   1049       /**
   1050        *  @brief  Remove a range of elements.
   1051        *  @param  first  Iterator pointing to the first element to be erased.
   1052        *  @param  last  Iterator pointing to one past the last element to be
   1053        *                erased.
   1054        *  @return  An iterator pointing to the element pointed to by @a last
   1055        *           prior to erasing (or end()).
   1056        *
   1057        *  This function will erase the elements in the range [first,last) and
   1058        *  shorten the %vector accordingly.
   1059        *
   1060        *  Note This operation could be expensive and if it is
   1061        *  frequently used the user should consider using std::list.
   1062        *  The user is also cautioned that this function only erases
   1063        *  the elements, and that if the elements themselves are
   1064        *  pointers, the pointed-to memory is not touched in any way.
   1065        *  Managing the pointer is the user's responsibility.
   1066        */
   1067       iterator
   1068       erase(iterator __first, iterator __last);
   1069 
   1070       /**
   1071        *  @brief  Swaps data with another %vector.
   1072        *  @param  x  A %vector of the same element and allocator types.
   1073        *
   1074        *  This exchanges the elements between two vectors in constant time.
   1075        *  (Three pointers, so it should be quite fast.)
   1076        *  Note that the global std::swap() function is specialized such that
   1077        *  std::swap(v1,v2) will feed to this function.
   1078        */
   1079       void
   1080       swap(vector& __x)
   1081       {
   1082 #if __google_stl_debug_dangling_vector
   1083         if (!this->_M_is_valid() || !__x._M_is_valid())
   1084           __throw_logic_error("swap() on corrupt (dangling?) vector");
   1085 #endif
   1086 	std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
   1087 	std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
   1088 	std::swap(this->_M_impl._M_end_of_storage,
   1089 		  __x._M_impl._M_end_of_storage);
   1090 
   1091 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
   1092 	// 431. Swapping containers with unequal allocators.
   1093 	std::__alloc_swap<_Tp_alloc_type>::_S_do_it(_M_get_Tp_allocator(),
   1094 						    __x._M_get_Tp_allocator());
   1095       }
   1096 
   1097       /**
   1098        *  Erases all the elements.  Note that this function only erases the
   1099        *  elements, and that if the elements themselves are pointers, the
   1100        *  pointed-to memory is not touched in any way.  Managing the pointer is
   1101        *  the user's responsibility.
   1102        */
   1103       void
   1104       clear()
   1105       {
   1106 #if __google_stl_debug_dangling_vector
   1107         if (!this->_M_is_valid())
   1108           __throw_logic_error("clear() on corrupt (dangling?) vector");
   1109 #endif
   1110 	_M_erase_at_end(this->_M_impl._M_start);
   1111       }
   1112 
   1113     protected:
   1114       /**
   1115        *  Memory expansion handler.  Uses the member allocation function to
   1116        *  obtain @a n bytes of memory, and then copies [first,last) into it.
   1117        */
   1118       template<typename _ForwardIterator>
   1119         pointer
   1120         _M_allocate_and_copy(size_type __n,
   1121 			     _ForwardIterator __first, _ForwardIterator __last)
   1122         {
   1123 	  pointer __result = this->_M_allocate(__n);
   1124 	  __try
   1125 	    {
   1126 	      std::__uninitialized_copy_a(__first, __last, __result,
   1127 					  _M_get_Tp_allocator());
   1128 	      return __result;
   1129 	    }
   1130 	  __catch(...)
   1131 	    {
   1132 	      _M_deallocate(__result, __n);
   1133 	      __throw_exception_again;
   1134 	    }
   1135 	}
   1136 
   1137 
   1138       // Internal constructor functions follow.
   1139 
   1140       // Called by the range constructor to implement [23.1.1]/9
   1141 
   1142       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1143       // 438. Ambiguity in the "do the right thing" clause
   1144       template<typename _Integer>
   1145         void
   1146         _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
   1147         {
   1148 	  this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n));
   1149 	  this->_M_impl._M_end_of_storage =
   1150 	    this->_M_impl._M_start + static_cast<size_type>(__n);
   1151 	  _M_fill_initialize(static_cast<size_type>(__n), __value);
   1152 	}
   1153 
   1154       // Called by the range constructor to implement [23.1.1]/9
   1155       template<typename _InputIterator>
   1156         void
   1157         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
   1158 			       __false_type)
   1159         {
   1160 	  typedef typename std::iterator_traits<_InputIterator>::
   1161 	    iterator_category _IterCategory;
   1162 	  _M_range_initialize(__first, __last, _IterCategory());
   1163 	}
   1164 
   1165       // Called by the second initialize_dispatch above
   1166       template<typename _InputIterator>
   1167         void
   1168         _M_range_initialize(_InputIterator __first,
   1169 			    _InputIterator __last, std::input_iterator_tag)
   1170         {
   1171 	  for (; __first != __last; ++__first)
   1172 	    push_back(*__first);
   1173 	}
   1174 
   1175       // Called by the second initialize_dispatch above
   1176       template<typename _ForwardIterator>
   1177         void
   1178         _M_range_initialize(_ForwardIterator __first,
   1179 			    _ForwardIterator __last, std::forward_iterator_tag)
   1180         {
   1181 	  const size_type __n = std::distance(__first, __last);
   1182 	  this->_M_impl._M_start = this->_M_allocate(__n);
   1183 	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
   1184 	  this->_M_impl._M_finish =
   1185 	    std::__uninitialized_copy_a(__first, __last,
   1186 					this->_M_impl._M_start,
   1187 					_M_get_Tp_allocator());
   1188 	}
   1189 
   1190       // Called by the first initialize_dispatch above and by the
   1191       // vector(n,value,a) constructor.
   1192       void
   1193       _M_fill_initialize(size_type __n, const value_type& __value)
   1194       {
   1195 	std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
   1196 				      _M_get_Tp_allocator());
   1197 	this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
   1198       }
   1199 
   1200 #ifdef __GXX_EXPERIMENTAL_CXX0X__
   1201       // Called by the vector(n) constructor.
   1202       void
   1203       _M_default_initialize(size_type __n)
   1204       {
   1205 	std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
   1206 					 _M_get_Tp_allocator());
   1207 	this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
   1208       }
   1209 #endif
   1210 
   1211       // Internal assign functions follow.  The *_aux functions do the actual
   1212       // assignment work for the range versions.
   1213 
   1214       // Called by the range assign to implement [23.1.1]/9
   1215 
   1216       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1217       // 438. Ambiguity in the "do the right thing" clause
   1218       template<typename _Integer>
   1219         void
   1220         _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
   1221         { _M_fill_assign(__n, __val); }
   1222 
   1223       // Called by the range assign to implement [23.1.1]/9
   1224       template<typename _InputIterator>
   1225         void
   1226         _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
   1227 			   __false_type)
   1228         {
   1229 	  typedef typename std::iterator_traits<_InputIterator>::
   1230 	    iterator_category _IterCategory;
   1231 	  _M_assign_aux(__first, __last, _IterCategory());
   1232 	}
   1233 
   1234       // Called by the second assign_dispatch above
   1235       template<typename _InputIterator>
   1236         void
   1237         _M_assign_aux(_InputIterator __first, _InputIterator __last,
   1238 		      std::input_iterator_tag);
   1239 
   1240       // Called by the second assign_dispatch above
   1241       template<typename _ForwardIterator>
   1242         void
   1243         _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
   1244 		      std::forward_iterator_tag);
   1245 
   1246       // Called by assign(n,t), and the range assign when it turns out
   1247       // to be the same thing.
   1248       void
   1249       _M_fill_assign(size_type __n, const value_type& __val);
   1250 
   1251 
   1252       // Internal insert functions follow.
   1253 
   1254       // Called by the range insert to implement [23.1.1]/9
   1255 
   1256       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1257       // 438. Ambiguity in the "do the right thing" clause
   1258       template<typename _Integer>
   1259         void
   1260         _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
   1261 			   __true_type)
   1262         { _M_fill_insert(__pos, __n, __val); }
   1263 
   1264       // Called by the range insert to implement [23.1.1]/9
   1265       template<typename _InputIterator>
   1266         void
   1267         _M_insert_dispatch(iterator __pos, _InputIterator __first,
   1268 			   _InputIterator __last, __false_type)
   1269         {
   1270 	  typedef typename std::iterator_traits<_InputIterator>::
   1271 	    iterator_category _IterCategory;
   1272 	  _M_range_insert(__pos, __first, __last, _IterCategory());
   1273 	}
   1274 
   1275       // Called by the second insert_dispatch above
   1276       template<typename _InputIterator>
   1277         void
   1278         _M_range_insert(iterator __pos, _InputIterator __first,
   1279 			_InputIterator __last, std::input_iterator_tag);
   1280 
   1281       // Called by the second insert_dispatch above
   1282       template<typename _ForwardIterator>
   1283         void
   1284         _M_range_insert(iterator __pos, _ForwardIterator __first,
   1285 			_ForwardIterator __last, std::forward_iterator_tag);
   1286 
   1287       // Called by insert(p,n,x), and the range insert when it turns out to be
   1288       // the same thing.
   1289       void
   1290       _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
   1291 
   1292 #ifdef __GXX_EXPERIMENTAL_CXX0X__
   1293       // Called by resize(n).
   1294       void
   1295       _M_default_append(size_type __n);
   1296 #endif
   1297 
   1298       // Called by insert(p,x)
   1299 #ifndef __GXX_EXPERIMENTAL_CXX0X__
   1300       void
   1301       _M_insert_aux(iterator __position, const value_type& __x);
   1302 #else
   1303       template<typename... _Args>
   1304         void
   1305         _M_insert_aux(iterator __position, _Args&&... __args);
   1306 #endif
   1307 
   1308       // Called by the latter.
   1309       size_type
   1310       _M_check_len(size_type __n, const char* __s) const
   1311       {
   1312 	if (max_size() - size() < __n)
   1313 	  __throw_length_error(__N(__s));
   1314 
   1315 	const size_type __len = size() + std::max(size(), __n);
   1316 	return (__len < size() || __len > max_size()) ? max_size() : __len;
   1317       }
   1318 
   1319       // Internal erase functions follow.
   1320 
   1321       // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
   1322       // _M_assign_aux.
   1323       void
   1324       _M_erase_at_end(pointer __pos)
   1325       {
   1326 	std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
   1327 	this->_M_impl._M_finish = __pos;
   1328       }
   1329     };
   1330 
   1331 
   1332   /**
   1333    *  @brief  Vector equality comparison.
   1334    *  @param  x  A %vector.
   1335    *  @param  y  A %vector of the same type as @a x.
   1336    *  @return  True iff the size and elements of the vectors are equal.
   1337    *
   1338    *  This is an equivalence relation.  It is linear in the size of the
   1339    *  vectors.  Vectors are considered equivalent if their sizes are equal,
   1340    *  and if corresponding elements compare equal.
   1341   */
   1342   template<typename _Tp, typename _Alloc>
   1343     inline bool
   1344     operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
   1345     { return (__x.size() == __y.size()
   1346 	      && std::equal(__x.begin(), __x.end(), __y.begin())); }
   1347 
   1348   /**
   1349    *  @brief  Vector ordering relation.
   1350    *  @param  x  A %vector.
   1351    *  @param  y  A %vector of the same type as @a x.
   1352    *  @return  True iff @a x is lexicographically less than @a y.
   1353    *
   1354    *  This is a total ordering relation.  It is linear in the size of the
   1355    *  vectors.  The elements must be comparable with @c <.
   1356    *
   1357    *  See std::lexicographical_compare() for how the determination is made.
   1358   */
   1359   template<typename _Tp, typename _Alloc>
   1360     inline bool
   1361     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
   1362     { return std::lexicographical_compare(__x.begin(), __x.end(),
   1363 					  __y.begin(), __y.end()); }
   1364 
   1365   /// Based on operator==
   1366   template<typename _Tp, typename _Alloc>
   1367     inline bool
   1368     operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
   1369     { return !(__x == __y); }
   1370 
   1371   /// Based on operator<
   1372   template<typename _Tp, typename _Alloc>
   1373     inline bool
   1374     operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
   1375     { return __y < __x; }
   1376 
   1377   /// Based on operator<
   1378   template<typename _Tp, typename _Alloc>
   1379     inline bool
   1380     operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
   1381     { return !(__y < __x); }
   1382 
   1383   /// Based on operator<
   1384   template<typename _Tp, typename _Alloc>
   1385     inline bool
   1386     operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
   1387     { return !(__x < __y); }
   1388 
   1389   /// See std::vector::swap().
   1390   template<typename _Tp, typename _Alloc>
   1391     inline void
   1392     swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
   1393     { __x.swap(__y); }
   1394 
   1395 _GLIBCXX_END_NAMESPACE_CONTAINER
   1396 } // namespace std
   1397 
   1398 #endif /* _STL_VECTOR_H */
   1399