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

📄 stl_bvector.h

📁 gcc-you can use this code to learn something about gcc, and inquire further into linux,
💻 H
📖 第 1 页 / 共 2 页
字号:
    protected:    using _Bvector_base<_Alloc>::_M_bit_alloc;    using _Bvector_base<_Alloc>::_M_deallocate;    using _Bvector_base<_Alloc>::_M_start;    using _Bvector_base<_Alloc>::_M_finish;    using _Bvector_base<_Alloc>::_M_end_of_storage;    protected:    void _M_initialize(size_type __n) {      _Bit_type * __q = _M_bit_alloc(__n);      _M_end_of_storage = __q + (__n + _M_word_bit - 1)/_M_word_bit;      _M_start = iterator(__q, 0);      _M_finish = _M_start + difference_type(__n);    }    void _M_insert_aux(iterator __position, bool __x) {      if (_M_finish._M_p != _M_end_of_storage) {        copy_backward(__position, _M_finish, _M_finish + 1);        *__position = __x;        ++_M_finish;      }      else {        size_type __len = size() 	                  ? 2 * size() : static_cast<size_type>(_M_word_bit);        _Bit_type * __q = _M_bit_alloc(__len);        iterator __i = copy(begin(), __position, iterator(__q, 0));        *__i++ = __x;        _M_finish = copy(__position, end(), __i);        _M_deallocate();        _M_end_of_storage = __q + (__len + _M_word_bit - 1)/_M_word_bit;        _M_start = iterator(__q, 0);      }    }      template <class _InputIterator>    void _M_initialize_range(_InputIterator __first, _InputIterator __last,                             input_iterator_tag) {      _M_start = iterator();      _M_finish = iterator();      _M_end_of_storage = 0;      for ( ; __first != __last; ++__first)         push_back(*__first);    }      template <class _ForwardIterator>    void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,                             forward_iterator_tag) {      size_type __n = distance(__first, __last);      _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 = distance(__first, __last);        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);          _Bit_type * __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 + _M_word_bit - 1)/_M_word_bit;          _M_start = iterator(__q, 0);        }      }    }          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)); }      void _M_range_check(size_type __n) const {      if (__n >= this->size())        __throw_out_of_range("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]; }      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);      fill(_M_start._M_p, _M_end_of_storage, __value ? ~0 : 0);    }      explicit vector(size_type __n)      : _Bvector_base<_Alloc>(allocator_type())    {      _M_initialize(__n);      fill(_M_start._M_p, _M_end_of_storage, 0);    }      vector(const vector& __x) : _Bvector_base<_Alloc>(__x.get_allocator()) {      _M_initialize(__x.size());      copy(__x.begin(), __x.end(), _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);      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<_Alloc>(__a)    {      typedef typename _Is_integer<_InputIterator>::_Integral _Integral;      _M_initialize_dispatch(__first, __last, _Integral());    }          ~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); }      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 = distance(__first, __last);      if (__len < size())        erase(copy(__first, __last, begin()), end());      else {        _ForwardIterator __mid = __first;        advance(__mid, size());        copy(__first, __mid, begin());        insert(end(), __mid, __last);      }    }          void reserve(size_type __n) {      if (__n > this->max_size())	__throw_length_error("vector::reserve");      if (this->capacity() < __n) {        _Bit_type * __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 + _M_word_bit - 1)/_M_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(vector<bool, _Alloc>& __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);    }    // [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()) {      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;    }      // 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());    }      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);        _Bit_type * __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 + _M_word_bit - 1)/_M_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 (_Bit_type * __p = _M_start._M_p; __p != _M_end_of_storage; ++__p)        *__p = ~*__p;    }      void clear() { erase(begin(), end()); }  };// This typedef is non-standard.  It is provided for backward compatibility.typedef vector<bool, __alloc> bit_vector;} // namespace std #endif /* __GLIBCPP_INTERNAL_BVECTOR_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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