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

📄 stl_bvector.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 2 页
字号:
	  this->_M_impl._M_finish = std::copy(__position, end(), __i);	  this->_M_deallocate();	  this->_M_impl._M_end_of_storage = (__q + ((__len						     + int(_S_word_bit) - 1)						    / int(_S_word_bit)));	  this->_M_impl._M_start = iterator(__q, 0);	}    }    template<class _InputIterator>      void      _M_initialize_range(_InputIterator __first, _InputIterator __last,			  std::input_iterator_tag)      {	this->_M_impl._M_start = iterator();	this->_M_impl._M_finish = iterator();	this->_M_impl._M_end_of_storage = 0;	for (; __first != __last; ++__first)	  push_back(*__first);      }    template<class _ForwardIterator>      void      _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,			  std::forward_iterator_tag)      {	const size_type __n = std::distance(__first, __last);	_M_initialize(__n);	std::copy(__first, __last, this->_M_impl._M_start);      }    template<class _InputIterator>      void      _M_insert_range(iterator __pos, _InputIterator __first, 		      _InputIterator __last, std::input_iterator_tag)      {	for (; __first != __last; ++__first)	  {	    __pos = insert(__pos, *__first);	    ++__pos;	  }      }    template<class _ForwardIterator>      void      _M_insert_range(iterator __position, _ForwardIterator __first, 		      _ForwardIterator __last, std::forward_iterator_tag)      {	if (__first != __last)	  {	    size_type __n = std::distance(__first, __last);	    if (capacity() - size() >= __n)	      {		std::copy_backward(__position, end(),				   this->_M_impl._M_finish				   + difference_type(__n));		std::copy(__first, __last, __position);		this->_M_impl._M_finish += difference_type(__n);	      }	    else	      {		const size_type __len = size() + std::max(size(), __n);		_Bit_type * __q = this->_M_allocate(__len);		iterator __i = std::copy(begin(), __position,					 iterator(__q, 0));		__i = std::copy(__first, __last, __i);		this->_M_impl._M_finish = std::copy(__position, end(), __i);		this->_M_deallocate();		this->_M_impl._M_end_of_storage = (__q						   + ((__len						       + int(_S_word_bit) - 1)						      / int(_S_word_bit)));		this->_M_impl._M_start = iterator(__q, 0);	      }	  }      }  public:    iterator    begin()    { return this->_M_impl._M_start; }    const_iterator    begin() const    { return this->_M_impl._M_start; }    iterator    end()    { return this->_M_impl._M_finish; }    const_iterator    end() const    { return this->_M_impl._M_finish; }    reverse_iterator    rbegin()    { return reverse_iterator(end()); }    const_reverse_iterator    rbegin() const    { return const_reverse_iterator(end()); }    reverse_iterator    rend()    { return reverse_iterator(begin()); }    const_reverse_iterator    rend() const    { return const_reverse_iterator(begin()); }    size_type    size() const    { return size_type(end() - begin()); }    size_type    max_size() const    { return size_type(-1); }    size_type    capacity() const    { return size_type(const_iterator(this->_M_impl._M_end_of_storage, 0)		       - begin()); }    bool    empty() const    { return begin() == end(); }    reference    operator[](size_type __n)    { return *(begin() + difference_type(__n)); }    const_reference    operator[](size_type __n) const    { return *(begin() + difference_type(__n)); }    void    _M_range_check(size_type __n) const    {      if (__n >= this->size())        __throw_out_of_range(__N("vector<bool>::_M_range_check"));    }    reference    at(size_type __n)    { _M_range_check(__n); return (*this)[__n]; }    const_reference    at(size_type __n) const    { _M_range_check(__n); return (*this)[__n]; }    explicit    vector(const allocator_type& __a = allocator_type())    : _Bvector_base<_Alloc>(__a) { }    vector(size_type __n, bool __value, 	   const allocator_type& __a = allocator_type())    : _Bvector_base<_Alloc>(__a)    {      _M_initialize(__n);      std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage, 		__value ? ~0 : 0);    }    explicit    vector(size_type __n)    : _Bvector_base<_Alloc>(allocator_type())    {      _M_initialize(__n);      std::fill(this->_M_impl._M_start._M_p, 		this->_M_impl._M_end_of_storage, 0);    }    vector(const vector& __x)    : _Bvector_base<_Alloc>(__x.get_allocator())    {      _M_initialize(__x.size());      std::copy(__x.begin(), __x.end(), this->_M_impl._M_start);    }    // Check whether it's an integral type.  If so, it's not an iterator.    template<class _Integer>      void      _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)      {	_M_initialize(__n);	std::fill(this->_M_impl._M_start._M_p, 		  this->_M_impl._M_end_of_storage, __x ? ~0 : 0);      }    template<class _InputIterator>      void       _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,			     __false_type)      { _M_initialize_range(__first, __last, 			    std::__iterator_category(__first)); }    template<class _InputIterator>      vector(_InputIterator __first, _InputIterator __last,	     const allocator_type& __a = allocator_type())      : _Bvector_base<_Alloc>(__a)      {	typedef typename std::__is_integer<_InputIterator>::__type _Integral;	_M_initialize_dispatch(__first, __last, _Integral());      }    ~vector() { }    vector&    operator=(const vector& __x)    {      if (&__x == this)	return *this;      if (__x.size() > capacity())	{	  this->_M_deallocate();	  _M_initialize(__x.size());	}      std::copy(__x.begin(), __x.end(), begin());      this->_M_impl._M_finish = begin() + difference_type(__x.size());      return *this;    }    // assign(), a generalized assignment member function.  Two    // versions: one that takes a count, and one that takes a range.    // The range version is a member template, so we dispatch on whether    // or not the type is an integer.    void    _M_fill_assign(size_t __n, bool __x)    {      if (__n > size())	{	  std::fill(this->_M_impl._M_start._M_p, 		    this->_M_impl._M_end_of_storage, __x ? ~0 : 0);	  insert(end(), __n - size(), __x);	}      else	{	  erase(begin() + __n, end());	  std::fill(this->_M_impl._M_start._M_p, 		    this->_M_impl._M_end_of_storage, __x ? ~0 : 0);	}    }    void    assign(size_t __n, bool __x)    { _M_fill_assign(__n, __x); }    template<class _InputIterator>      void      assign(_InputIterator __first, _InputIterator __last)      {	typedef typename std::__is_integer<_InputIterator>::__type _Integral;	_M_assign_dispatch(__first, __last, _Integral());      }    template<class _Integer>      void      _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)      { _M_fill_assign((size_t) __n, (bool) __val); }    template<class _InputIterator>      void      _M_assign_dispatch(_InputIterator __first, _InputIterator __last,			 __false_type)      { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }    template<class _InputIterator>      void      _M_assign_aux(_InputIterator __first, _InputIterator __last,		    std::input_iterator_tag)      {	iterator __cur = begin();	for (; __first != __last && __cur != end(); ++__cur, ++__first)	  *__cur = *__first;	if (__first == __last)	  erase(__cur, end());	else	  insert(end(), __first, __last);      }        template<class _ForwardIterator>      void      _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,		    std::forward_iterator_tag)      {	const size_type __len = std::distance(__first, __last);	if (__len < size())	  erase(std::copy(__first, __last, begin()), end());	else	  {	    _ForwardIterator __mid = __first;	    std::advance(__mid, size());	    std::copy(__first, __mid, begin());	    insert(end(), __mid, __last);	  }      }    void    reserve(size_type __n)    {      if (__n > this->max_size())	__throw_length_error(__N("vector::reserve"));      if (this->capacity() < __n)	{	  _Bit_type* __q = this->_M_allocate(__n);	  this->_M_impl._M_finish = std::copy(begin(), end(), 					      iterator(__q, 0));	  this->_M_deallocate();	  this->_M_impl._M_start = iterator(__q, 0);	  this->_M_impl._M_end_of_storage = (__q + (__n + int(_S_word_bit) - 1)					     / int(_S_word_bit));	}    }    reference    front()    { return *begin(); }    const_reference    front() const    { return *begin(); }    reference    back()    { return *(end() - 1); }    const_reference    back() const    { return *(end() - 1); }    // _GLIBCXX_RESOLVE_LIB_DEFECTS    // DR 464. Suggestion for new member functions in standard containers.    // N.B. DR 464 says nothing about vector<bool> but we need something    // here due to the way we are implementing DR 464 in the debug-mode    // vector class.    void    data() { }    void    push_back(bool __x)    {      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)        *this->_M_impl._M_finish++ = __x;      else        _M_insert_aux(end(), __x);    }    void    swap(vector<bool, _Alloc>& __x)    {      std::swap(this->_M_impl._M_start, __x._M_impl._M_start);      std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);      std::swap(this->_M_impl._M_end_of_storage, 		__x._M_impl._M_end_of_storage);    }    // [23.2.5]/1, third-to-last entry in synopsis listing    static void    swap(reference __x, reference __y)    {      bool __tmp = __x;      __x = __y;      __y = __tmp;    }    iterator    insert(iterator __position, bool __x = bool())    {      const difference_type __n = __position - begin();      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage	  && __position == end())        *this->_M_impl._M_finish++ = __x;      else        _M_insert_aux(__position, __x);      return begin() + __n;    }    // Check whether it's an integral type.  If so, it's not an iterator.    template<class _Integer>      void      _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,			 __true_type)      { _M_fill_insert(__pos, __n, __x); }    template<class _InputIterator>      void      _M_insert_dispatch(iterator __pos,			 _InputIterator __first, _InputIterator __last,			 __false_type)      { _M_insert_range(__pos, __first, __last,			std::__iterator_category(__first)); }    template<class _InputIterator>      void      insert(iterator __position,	     _InputIterator __first, _InputIterator __last)      {	typedef typename std::__is_integer<_InputIterator>::__type _Integral;	_M_insert_dispatch(__position, __first, __last, _Integral());      }    void    _M_fill_insert(iterator __position, size_type __n, bool __x)    {      if (__n == 0)	return;      if (capacity() - size() >= __n)	{	  std::copy_backward(__position, end(),			     this->_M_impl._M_finish + difference_type(__n));	  std::fill(__position, __position + difference_type(__n), __x);	  this->_M_impl._M_finish += difference_type(__n);	}      else	{	  const size_type __len = size() + std::max(size(), __n);	  _Bit_type * __q = this->_M_allocate(__len);	  iterator __i = std::copy(begin(), __position, iterator(__q, 0));	  std::fill_n(__i, __n, __x);	  this->_M_impl._M_finish = std::copy(__position, end(),					      __i + difference_type(__n));	  this->_M_deallocate();	  this->_M_impl._M_end_of_storage = (__q + ((__len						     + int(_S_word_bit) - 1)						    / int(_S_word_bit)));	  this->_M_impl._M_start = iterator(__q, 0);	}    }    void    insert(iterator __position, size_type __n, bool __x)    { _M_fill_insert(__position, __n, __x); }    void    pop_back()    { --this->_M_impl._M_finish; }    iterator    erase(iterator __position)    {      if (__position + 1 != end())        std::copy(__position + 1, end(), __position);      --this->_M_impl._M_finish;      return __position;    }    iterator    erase(iterator __first, iterator __last)    {      this->_M_impl._M_finish = std::copy(__last, end(), __first);      return __first;    }    void    resize(size_type __new_size, bool __x = bool())    {      if (__new_size < size())        erase(begin() + difference_type(__new_size), end());      else        insert(end(), __new_size - size(), __x);    }    void    flip()    {      for (_Bit_type * __p = this->_M_impl._M_start._M_p;	   __p != this->_M_impl._M_end_of_storage; ++__p)        *__p = ~*__p;    }    void    clear()    { erase(begin(), end()); }  };} // namespace std#endif

⌨️ 快捷键说明

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