stl_vector.h

来自「symbian上STL模板库的实现」· C头文件 代码 · 共 933 行 · 第 1/3 页

H
933
字号
// Vector implementation -*- C++ -*-// Copyright (C) 2001, 2002, 2003 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 2, 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.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License./* * * 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 * 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_vector.h *  This is an internal header file, included by other library headers. *  You should not attempt to use it directly. */#ifndef _VECTOR_H#define _VECTOR_H 1#include <bits/stl_iterator_base_funcs.h>#include <bits/functexcept.h>#include <bits/concept_check.h>namespace _GLIBCXX_STD{    /**     *  @if maint     *  See bits/stl_deque.h's _Deque_base for an explanation.     *  @endif     */    template<typename _Tp, typename _Alloc>        struct _Vector_base        {            struct _Vector_impl                 : public _Alloc {                    _Tp*           _M_start;                    _Tp*           _M_finish;                    _Tp*           _M_end_of_storage;                    _Vector_impl (_Alloc const& __a)                        : _Alloc(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)                    { }                };            public:            typedef _Alloc allocator_type;            allocator_type                get_allocator() const { return *static_cast<const _Alloc*>(&this->_M_impl); }            _Vector_base(const allocator_type& __a) : _M_impl(__a)            { }            _Vector_base(size_t __n, const allocator_type& __a)                : _M_impl(__a)            {                this->_M_impl._M_start = this->_M_allocate(__n);                this->_M_impl._M_finish = this->_M_impl._M_start;                this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;            }            ~_Vector_base()            { _M_deallocate(this->_M_impl._M_start,                    this->_M_impl._M_end_of_storage - this->_M_impl._M_start); }            public:            _Vector_impl _M_impl;            _Tp*                _M_allocate(size_t __n) { return _M_impl.allocate(__n); }            void                _M_deallocate(_Tp* __p, size_t __n)                { if (__p) _M_impl.deallocate(__p, __n); }        };    /**     *  @brief A standard container which offers fixed time access to     *  individual elements in any order.     *     *  @ingroup Containers     *  @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 push_front and @c pop_front.     *     *  In some terminology a %vector can be described as a dynamic     *  C-style array, it offers fast and efficient access to individual     *  elements in any order and saves the user from worrying about     *  memory and size allocation.  Subscripting ( @c [] ) access is     *  also provided as with C-style arrays.     */    template<typename _Tp, typename _Alloc = allocator<_Tp> >        class vector : protected _Vector_base<_Tp, _Alloc>    {        // Concept requirements.        __glibcxx_class_requires(_Tp, _SGIAssignableConcept)            typedef _Vector_base<_Tp, _Alloc>			_Base;        typedef vector<_Tp, _Alloc>			vector_type;        public:        typedef _Tp					 value_type;        typedef typename _Alloc::pointer                   pointer;        typedef typename _Alloc::const_pointer             const_pointer;        typedef typename _Alloc::reference                 reference;        typedef typename _Alloc::const_reference           const_reference;        typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;        typedef __gnu_cxx::__normal_iterator<const_pointer, vector_type>            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 typename _Base::allocator_type		 allocator_type;        protected:        /** @if maint         *  These two functions and three data members are all from the         *  base class.  They should be pretty self-explanatory, as         *  %vector uses a simple contiguous allocation scheme.  @endif         */        using _Base::_M_allocate;        using _Base::_M_deallocate;        using _Base::_M_impl;        public:        // [23.2.4.1] construct/copy/destroy        // (assign() and get_allocator() are also listed in this section)        /**         *  @brief  Default constructor creates no elements.         */        explicit            vector(const allocator_type& __a = allocator_type())            : _Base(__a) { }        /**         *  @brief  Create a %vector with copies of an exemplar element.         *  @param  n  The number of elements to initially create.         *  @param  value  An element to copy.         *         *  This constructor fills the %vector with @a n copies of @a value.         */        vector(size_type __n, const value_type& __value,                const allocator_type& __a = allocator_type())            : _Base(__n, __a)        { this->_M_impl._M_finish = std::uninitialized_fill_n(this->_M_impl._M_start,                __n, __value); }        /**         *  @brief  Create a %vector with default elements.         *  @param  n  The number of elements to initially create.         *         *  This constructor fills the %vector with @a n copies of a         *  default-constructed element.         */        explicit            vector(size_type __n)            : _Base(__n, allocator_type())            { this->_M_impl._M_finish = std::uninitialized_fill_n(this->_M_impl._M_start,                    __n, value_type()); }        /**         *  @brief  %Vector copy constructor.         *  @param  x  A %vector of identical element and allocator types.         *         *  The newly-created %vector uses a copy of the allocation         *  object used by @a x.  All the elements of @a x are copied,         *  but any extra memory in         *  @a x (for fast expansion) will not be copied.         */        vector(const vector& __x)            : _Base(__x.size(), __x.get_allocator())        { this->_M_impl._M_finish = std::uninitialized_copy(__x.begin(), __x.end(),                this->_M_impl._M_start);        }        /**         *  @brief  Builds a %vector from a range.         *  @param  first  An input iterator.         *  @param  last  An input iterator.         *         *  Create a %vector consisting of copies of the elements from         *  [first,last).         *         *  If the iterators are forward, bidirectional, or         *  random-access, then this will call the elements' copy         *  constructor N times (where N is distance(first,last)) and do         *  no memory reallocation.  But if only input iterators are         *  used, then this will do at most 2N calls to the copy         *  constructor, and logN memory reallocations.         */        template<typename _InputIterator>            vector(_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 _Is_integer<_InputIterator>::_Integral _Integral;                _M_initialize_dispatch(__first, __last, _Integral());            }        /**         *  The 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         *  responsibilty.         */        ~vector() { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish); }        /**         *  @brief  %Vector assignment operator.         *  @param  x  A %vector of identical element and allocator types.         *         *  All the elements of @a x are copied, but any extra memory in         *  @a x (for fast expansion) will not be copied.  Unlike the         *  copy constructor, the allocator object is not copied.         */        vector&            operator=(const vector& __x);        /**         *  @brief  Assigns a given value to a %vector.         *  @param  n  Number of elements to be assigned.         *  @param  val  Value to be assigned.         *         *  This function fills a %vector with @a n copies of the given         *  value.  Note that the assignment completely changes the         *  %vector and that the resulting %vector'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 %vector.         *  @param  first  An input iterator.         *  @param  last   An input iterator.         *         *  This function fills a %vector with copies of the elements in the         *  range [first,last).         *         *  Note that the assignment completely changes the %vector and         *  that the resulting %vector'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 _Is_integer<_InputIterator>::_Integral _Integral;                _M_assign_dispatch(__first, __last, _Integral());            }        /// Get a copy of the memory allocation object.        using _Base::get_allocator;        // iterators        /**         *  Returns a read/write iterator that points to the first         *  element in the %vector.  Iteration is done in ordinary         *  element order.

⌨️ 快捷键说明

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