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

📄 stl_bvector.h

📁 著名的SGI的STL lib源码.(C++范型类编成,没有合适的分类,但是放到数据结构类别中也绝对适合)
💻 H
📖 第 1 页 / 共 2 页
字号:
      ++finish;    }    else {      size_type len = size() ? 2 * size() : __WORD_BIT;      unsigned int* q = bit_alloc(len);      iterator i = copy(begin(), position, iterator(q, 0));      *i++ = x;      finish = copy(position, end(), i);      deallocate();      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;      start = iterator(q, 0);    }  }#ifdef __STL_MEMBER_TEMPLATES  template <class InputIterator>  void initialize_range(InputIterator first, InputIterator last,                        input_iterator_tag) {    start = iterator();    finish = iterator();    end_of_storage = 0;    for ( ; first != last; ++first)       push_back(*first);  }  template <class ForwardIterator>  void initialize_range(ForwardIterator first, ForwardIterator last,                        forward_iterator_tag) {    size_type n = 0;    distance(first, last, n);    initialize(n);    copy(first, last, start);  }  template <class InputIterator>  void insert_range(iterator pos,                    InputIterator first, InputIterator last,                    input_iterator_tag) {    for ( ; first != last; ++first) {      pos = insert(pos, *first);      ++pos;    }  }  template <class ForwardIterator>  void 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(), finish + difference_type(n));        copy(first, last, position);        finish += difference_type(n);      }      else {        size_type len = size() + max(size(), n);        unsigned int* q = bit_alloc(len);        iterator i = copy(begin(), position, iterator(q, 0));        i = copy(first, last, i);        finish = copy(position, end(), i);        deallocate();        end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;        start = iterator(q, 0);      }    }  }      #endif /* __STL_MEMBER_TEMPLATES */public:  iterator begin() { return start; }  const_iterator begin() const { return start; }  iterator end() { return finish; }  const_iterator end() const { return 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(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));  }  __BVECTOR() : start(iterator()), finish(iterator()), end_of_storage(0) {}  __BVECTOR(size_type n, bool value) {    initialize(n);    fill(start.p, end_of_storage, value ? ~0 : 0);  }  __BVECTOR(int n, bool value) {    initialize(n);    fill(start.p, end_of_storage, value ? ~0 : 0);  }  __BVECTOR(long n, bool value) {    initialize(n);    fill(start.p, end_of_storage, value ? ~0 : 0);  }  explicit __BVECTOR(size_type n) {    initialize(n);    fill(start.p, end_of_storage, 0);  }  __BVECTOR(const __BVECTOR& x) {    initialize(x.size());    copy(x.begin(), x.end(), start);  }#ifdef __STL_MEMBER_TEMPLATES  template <class InputIterator>  __BVECTOR(InputIterator first, InputIterator last) {    initialize_range(first, last, iterator_category(first));  }#else /* __STL_MEMBER_TEMPLATES */  __BVECTOR(const_iterator first, const_iterator last) {    size_type n = 0;    distance(first, last, n);    initialize(n);    copy(first, last, start);  }  __BVECTOR(const bool* first, const bool* last) {    size_type n = 0;    distance(first, last, n);    initialize(n);    copy(first, last, start);  }#endif /* __STL_MEMBER_TEMPLATES */  ~__BVECTOR() { deallocate(); }  __BVECTOR& operator=(const __BVECTOR& x) {    if (&x == this) return *this;    if (x.size() > capacity()) {      deallocate();      initialize(x.size());    }    copy(x.begin(), x.end(), begin());    finish = begin() + difference_type(x.size());    return *this;  }  void reserve(size_type n) {    if (capacity() < n) {      unsigned int* q = bit_alloc(n);      finish = copy(begin(), end(), iterator(q, 0));      deallocate();      start = iterator(q, 0);      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 (finish.p != end_of_storage)      *finish++ = x;    else      insert_aux(end(), x);  }  void swap(__BVECTOR& x) {    __STD::swap(start, x.start);    __STD::swap(finish, x.finish);    __STD::swap(end_of_storage, x.end_of_storage);  }  iterator insert(iterator position, bool x = bool()) {    difference_type n = position - begin();    if (finish.p != end_of_storage && position == end())      *finish++ = x;    else      insert_aux(position, x);    return begin() + n;  }#ifdef __STL_MEMBER_TEMPLATES  template <class InputIterator> void insert(iterator position,                                             InputIterator first,                                             InputIterator last) {    insert_range(position, first, last, iterator_category(first));  }#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(), finish + n);      copy(first, last, position);      finish += n;    }    else {      size_type len = size() + max(size(), n);      unsigned int* q = bit_alloc(len);      iterator i = copy(begin(), position, iterator(q, 0));      i = copy(first, last, i);      finish = copy(position, end(), i);      deallocate();      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;      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(), finish + n);      copy(first, last, position);      finish += n;    }    else {      size_type len = size() + max(size(), n);      unsigned int* q = bit_alloc(len);      iterator i = copy(begin(), position, iterator(q, 0));      i = copy(first, last, i);      finish = copy(position, end(), i);      deallocate();      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;      start = iterator(q, 0);    }  }#endif /* __STL_MEMBER_TEMPLATES */    void insert(iterator position, size_type n, bool x) {    if (n == 0) return;    if (capacity() - size() >= n) {      copy_backward(position, end(), finish + difference_type(n));      fill(position, position + difference_type(n), x);      finish += difference_type(n);    }    else {      size_type len = size() + max(size(), n);      unsigned int* q = bit_alloc(len);      iterator i = copy(begin(), position, iterator(q, 0));      fill_n(i, n, x);      finish = copy(position, end(), i + difference_type(n));      deallocate();      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;      start = iterator(q, 0);    }  }  void insert(iterator pos, int n, bool x)  { insert(pos, (size_type)n, x); }  void insert(iterator pos, long n, bool x) { insert(pos, (size_type)n, x); }  void pop_back() { --finish; }  iterator erase(iterator position) {    if (position + 1 != end())      copy(position + 1, end(), position);    --finish;    return position;  }  iterator erase(iterator first, iterator last) {    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 clear() { erase(begin(), end()); }};#ifdef __SGI_STL_VECBOOL_TEMPLATEtypedef vector<bool, alloc> bit_vector;#else /* __SGI_STL_VECBOOL_TEMPLATE */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 lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());}#endif /* __SGI_STL_VECBOOL_TEMPLATE */#undef __SGI_STL_VECBOOL_TEMPLATE#undef __BVECTOR#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)#pragma reset woff 1174#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 + -