STL vector

    技术2022-05-11  131

    // The vector base class serves two purposes.  First, its constructor// and destructor allocate (but don't initialize) storage.  This makes// exception safety easier.  Second, the base class encapsulates all of// the differences between SGI-style allocators and standard-conforming// allocators.#ifdef __STL_USE_STD_ALLOCATORS// Base class for ordinary allocators.template <class _Tp, class _Allocator, bool _IsStatic>class _Vector_alloc_base {public:  typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type          allocator_type;  allocator_type get_allocator() const { return _M_data_allocator; }  _Vector_alloc_base(const allocator_type& __a)    : _M_data_allocator(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)   {}  protected:  allocator_type _M_data_allocator;  _Tp* _M_start;  _Tp* _M_finish;  _Tp* _M_end_of_storage;  _Tp* _M_allocate(size_t __n)    { return _M_data_allocator.allocate(__n); }  void _M_deallocate(_Tp* __p, size_t __n)    { if (__p) _M_data_allocator.deallocate(__p, __n); }};

    // Specialization for allocators that have the property that we don't// actually have to store an allocator object.  template <class _Tp, class _Allocator>class _Vector_alloc_base<_Tp, _Allocator, true> {public:  typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type          allocator_type;  allocator_type get_allocator() const { return allocator_type(); }  _Vector_alloc_base(const allocator_type&)    : _M_start(0), _M_finish(0), _M_end_of_storage(0)   {}  protected:  _Tp* _M_start;  _Tp* _M_finish;  _Tp* _M_end_of_storage;  typedef typename _Alloc_traits<_Tp, _Allocator>::_Alloc_type _Alloc_type;  _Tp* _M_allocate(size_t __n)    { return _Alloc_type::allocate(__n); }  void _M_deallocate(_Tp* __p, size_t __n)    { _Alloc_type::deallocate(__p, __n);}};template <class _Tp, class _Alloc>struct _Vector_base  : public _Vector_alloc_base<_Tp, _Alloc,                              _Alloc_traits<_Tp, _Alloc>::_S_instanceless>{  typedef _Vector_alloc_base<_Tp, _Alloc,                              _Alloc_traits<_Tp, _Alloc>::_S_instanceless>          _Base;  typedef typename _Base::allocator_type allocator_type;  _Vector_base(const allocator_type& __a) : _Base(__a) {}  _Vector_base(size_t __n, const allocator_type& __a) : _Base(__a) {    _M_start = _M_allocate(__n);    _M_finish = _M_start;    _M_end_of_storage = _M_start + __n;  }  ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); }};

    template <class _Tp, class _Alloc> class _Vector_base {public:  typedef _Alloc allocator_type;  allocator_type get_allocator() const { return allocator_type(); }  _Vector_base(const _Alloc&)    : _M_start(0), _M_finish(0), _M_end_of_storage(0) {}  _Vector_base(size_t __n, const _Alloc&)    : _M_start(0), _M_finish(0), _M_end_of_storage(0)   {    _M_start = _M_allocate(__n);    _M_finish = _M_start;    _M_end_of_storage = _M_start + __n;  }  ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); }protected:  _Tp* _M_start;  _Tp* _M_finish;  _Tp* _M_end_of_storage;  typedef simple_alloc<_Tp, _Alloc> _M_data_allocator;  _Tp* _M_allocate(size_t __n)    { return _M_data_allocator::allocate(__n); }  void _M_deallocate(_Tp* __p, size_t __n)     { _M_data_allocator::deallocate(__p, __n); }};


    最新回复(0)