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

📄 stl_bvector.h

📁 STL 最新源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
  void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,                           forward_iterator_tag) {    size_type __n = 0;    distance(__first, __last, __n);    _M_initialize(__n);    copy(__first, __last, _M_start);  }  template <class _InputIterator>  void _M_insert_range(iterator __pos,                       _InputIterator __first, _InputIterator __last,                       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,                       forward_iterator_tag) {    if (__first != __last) {      size_type __n = 0;      distance(__first, __last, __n);      if (capacity() - size() >= __n) {        copy_backward(__position, end(), _M_finish + difference_type(__n));        copy(__first, __last, __position);        _M_finish += difference_type(__n);      }      else {        size_type __len = size() + max(size(), __n);        unsigned int* __q = _M_bit_alloc(__len);        iterator __i = copy(begin(), __position, iterator(__q, 0));        __i = copy(__first, __last, __i);        _M_finish = copy(__position, end(), __i);        _M_deallocate();        _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;        _M_start = iterator(__q, 0);      }    }  }      #endif /* __STL_MEMBER_TEMPLATES */public:  iterator begin() { return _M_start; }  const_iterator begin() const { return _M_start; }  iterator end() { return _M_finish; }  const_iterator end() const { return _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(_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)); }#ifdef __STL_THROW_RANGE_ERRORS  void _M_range_check(size_type __n) const {    if (__n >= this->size())      __stl_throw_range_error("vector<bool>");  }  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]; }#endif /* __STL_THROW_RANGE_ERRORS */  explicit __VECTOR(const allocator_type& __a = allocator_type())    : __BVECTOR_BASE(__a) {}  __VECTOR(size_type __n, bool __value,            const allocator_type& __a = allocator_type())    : __BVECTOR_BASE(__a)  {    _M_initialize(__n);    fill(_M_start._M_p, _M_end_of_storage, __value ? ~0 : 0);  }  explicit __VECTOR(size_type __n)    : __BVECTOR_BASE(allocator_type())  {    _M_initialize(__n);    fill(_M_start._M_p, _M_end_of_storage, 0);  }  __VECTOR(const __VECTOR& __x) : __BVECTOR_BASE(__x.get_allocator()) {    _M_initialize(__x.size());    copy(__x.begin(), __x.end(), _M_start);  }#ifdef __STL_MEMBER_TEMPLATES  // 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);    fill(_M_start._M_p, _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, __ITERATOR_CATEGORY(__first));  }  template <class _InputIterator>  __VECTOR(_InputIterator __first, _InputIterator __last,           const allocator_type& __a = allocator_type())    : __BVECTOR_BASE(__a)  {    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;    _M_initialize_dispatch(__first, __last, _Integral());  }    #else /* __STL_MEMBER_TEMPLATES */  __VECTOR(const_iterator __first, const_iterator __last,           const allocator_type& __a = allocator_type())    : __BVECTOR_BASE(__a)  {    size_type __n = 0;    distance(__first, __last, __n);    _M_initialize(__n);    copy(__first, __last, _M_start);  }  __VECTOR(const bool* __first, const bool* __last,           const allocator_type& __a = allocator_type())    : __BVECTOR_BASE(__a)  {    size_type __n = 0;    distance(__first, __last, __n);    _M_initialize(__n);    copy(__first, __last, _M_start);  }#endif /* __STL_MEMBER_TEMPLATES */  ~__VECTOR() { }  __VECTOR& operator=(const __VECTOR& __x) {    if (&__x == this) return *this;    if (__x.size() > capacity()) {      _M_deallocate();      _M_initialize(__x.size());    }    copy(__x.begin(), __x.end(), begin());    _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()) {      fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);      insert(end(), __n - size(), __x);    }    else {      erase(begin() + __n, end());      fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);    }  }  void assign(size_t __n, bool __x) { _M_fill_assign(__n, __x); }#ifdef __STL_MEMBER_TEMPLATES  template <class _InputIterator>  void assign(_InputIterator __first, _InputIterator __last) {    typedef typename _Is_integer<_InputIterator>::_Integral _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 _InputIter>  void _M_assign_dispatch(_InputIter __first, _InputIter __last, __false_type)    { _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first)); }  template <class _InputIterator>  void _M_assign_aux(_InputIterator __first, _InputIterator __last,                     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,                     forward_iterator_tag) {    size_type __len = 0;    distance(__first, __last, __len);    if (__len < size())      erase(copy(__first, __last, begin()), end());    else {      _ForwardIterator __mid = __first;      advance(__mid, size());      copy(__first, __mid, begin());      insert(end(), __mid, __last);    }  }    #endif /* __STL_MEMBER_TEMPLATES */  void reserve(size_type __n) {    if (capacity() < __n) {      unsigned int* __q = _M_bit_alloc(__n);      _M_finish = copy(begin(), end(), iterator(__q, 0));      _M_deallocate();      _M_start = iterator(__q, 0);      _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;    }  }  reference front() { return *begin(); }  const_reference front() const { return *begin(); }  reference back() { return *(end() - 1); }  const_reference back() const { return *(end() - 1); }  void push_back(bool __x) {    if (_M_finish._M_p != _M_end_of_storage)      *_M_finish++ = __x;    else      _M_insert_aux(end(), __x);  }  void swap(__BVECTOR& __x) {    __STD::swap(_M_start, __x._M_start);    __STD::swap(_M_finish, __x._M_finish);    __STD::swap(_M_end_of_storage, __x._M_end_of_storage);  }  iterator insert(iterator __position, bool __x = bool()) {    difference_type __n = __position - begin();    if (_M_finish._M_p != _M_end_of_storage && __position == end())      *_M_finish++ = __x;    else      _M_insert_aux(__position, __x);    return begin() + __n;  }#ifdef __STL_MEMBER_TEMPLATES  // 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, __ITERATOR_CATEGORY(__first));  }  template <class _InputIterator>  void insert(iterator __position,              _InputIterator __first, _InputIterator __last) {    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;    _M_insert_dispatch(__position, __first, __last, _Integral());  }#else /* __STL_MEMBER_TEMPLATES */  void insert(iterator __position,              const_iterator __first, const_iterator __last) {    if (__first == __last) return;    size_type __n = 0;    distance(__first, __last, __n);    if (capacity() - size() >= __n) {      copy_backward(__position, end(), _M_finish + __n);      copy(__first, __last, __position);      _M_finish += __n;    }    else {      size_type __len = size() + max(size(), __n);      unsigned int* __q = _M_bit_alloc(__len);      iterator __i = copy(begin(), __position, iterator(__q, 0));      __i = copy(__first, __last, __i);      _M_finish = copy(__position, end(), __i);      _M_deallocate();      _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;      _M_start = iterator(__q, 0);    }  }  void insert(iterator __position, const bool* __first, const bool* __last) {    if (__first == __last) return;    size_type __n = 0;    distance(__first, __last, __n);    if (capacity() - size() >= __n) {      copy_backward(__position, end(), _M_finish + __n);      copy(__first, __last, __position);      _M_finish += __n;    }    else {      size_type __len = size() + max(size(), __n);      unsigned int* __q = _M_bit_alloc(__len);      iterator __i = copy(begin(), __position, iterator(__q, 0));      __i = copy(__first, __last, __i);      _M_finish = copy(__position, end(), __i);      _M_deallocate();      _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;      _M_start = iterator(__q, 0);    }  }#endif /* __STL_MEMBER_TEMPLATES */  void _M_fill_insert(iterator __position, size_type __n, bool __x) {    if (__n == 0) return;    if (capacity() - size() >= __n) {      copy_backward(__position, end(), _M_finish + difference_type(__n));      fill(__position, __position + difference_type(__n), __x);      _M_finish += difference_type(__n);    }    else {      size_type __len = size() + max(size(), __n);      unsigned int* __q = _M_bit_alloc(__len);      iterator __i = copy(begin(), __position, iterator(__q, 0));      fill_n(__i, __n, __x);      _M_finish = copy(__position, end(), __i + difference_type(__n));      _M_deallocate();      _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;      _M_start = iterator(__q, 0);    }  }  void insert(iterator __position, size_type __n, bool __x) {    _M_fill_insert(__position, __n, __x);  }  void pop_back() { --_M_finish; }  iterator erase(iterator __position) {    if (__position + 1 != end())      copy(__position + 1, end(), __position);      --_M_finish;    return __position;  }  iterator erase(iterator __first, iterator __last) {    _M_finish = 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 (unsigned int* __p = _M_start._M_p; __p != _M_end_of_storage; ++__p)      *__p = ~*__p;  }  void clear() { erase(begin(), end()); }};#ifdef __SGI_STL_VECBOOL_TEMPLATE// This typedef is non-standard.  It is provided for backward compatibility.typedef vector<bool, alloc> bit_vector;#else /* __SGI_STL_VECBOOL_TEMPLATE */inline void swap(bit_vector& __x, bit_vector& __y) {  __x.swap(__y);}inline bool operator==(const bit_vector& __x, const bit_vector& __y){  return (__x.size() == __y.size() &&           equal(__x.begin(), __x.end(), __y.begin()));}inline bool operator!=(const bit_vector& __x, const bit_vector& __y){  return !(__x == __y);}inline bool operator<(const bit_vector& __x, const bit_vector& __y){  return lexicographical_compare(__x.begin(), __x.end(),                                  __y.begin(), __y.end());}inline bool operator>(const bit_vector& __x, const bit_vector& __y){  return __y < __x;}inline bool operator<=(const bit_vector& __x, const bit_vector& __y){  return !(__y < __x);}inline bool operator>=(const bit_vector& __x, const bit_vector& __y){  return !(__x < __y);}#endif /* __SGI_STL_VECBOOL_TEMPLATE */#undef __SGI_STL_VECBOOL_TEMPLATE#undef __BVECTOR#undef __VECTOR#undef __BVECTOR_BASE#undef __BVECTOR_TMPL_LIST #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)#pragma reset woff 1174#pragma reset woff 1375#endif__STL_END_NAMESPACE #endif /* __SGI_STL_INTERNAL_BVECTOR_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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