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

📄 _string.h

📁 stl的源码
💻 H
📖 第 1 页 / 共 3 页
字号:
  const_reverse_iterator rend()   const  { return const_reverse_iterator(this->_M_Start()); }public:                         // Size, capacity, etc.  size_type size() const     { return this->_M_Finish() - this->_M_Start(); }  size_type length() const   { return size(); }  size_type max_size() const { return _Base::max_size(); }  void resize(size_type __n, _CharT __c) {    if (__n <= size())      erase(begin() + __n, end());    else      append(__n - size(), __c);  }  void resize(size_type __n) { resize(__n, _M_null()); }private:  void _M_reserve(size_type);public:  void reserve(size_type = 0);  size_type capacity() const  { return this->_M_capacity() - 1; }  void clear() {    if (!empty()) {      _Traits::assign(*(this->_M_Start()), _M_null());      this->_M_finish = this->_M_Start();    }  }  bool empty() const { return this->_M_Start() == this->_M_Finish(); }public:                         // Element access.  const_reference operator[](size_type __n) const  { return *(this->_M_Start() + __n); }  reference operator[](size_type __n)  { return *(this->_M_Start() + __n); }  const_reference at(size_type __n) const {    if (__n >= size())      this->_M_throw_out_of_range();    return *(this->_M_Start() + __n);  }  reference at(size_type __n) {    if (__n >= size())      this->_M_throw_out_of_range();    return *(this->_M_Start() + __n);  }public:                         // Append, operator+=, push_back.  _Self& operator+=(const _Self& __s) { return append(__s); }  _Self& operator+=(const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) return append(__s); }  _Self& operator+=(_CharT __c) { push_back(__c); return *this; }private:  _Self& _M_append(const _CharT* __first, const _CharT* __last);#if defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)  template <class _InputIter>  _Self& _M_appendT(_InputIter __first, _InputIter __last,                    const input_iterator_tag &) {    for ( ; __first != __last ; ++__first)      push_back(*__first);    return *this;  }  template <class _ForwardIter>  _Self& _M_appendT(_ForwardIter __first, _ForwardIter __last,                    const forward_iterator_tag &) {    if (__first != __last) {      size_type __n = __STATIC_CAST(size_type, _STLP_STD::distance(__first, __last));      if (__n >= this->_M_rest()) {        size_type __len = _M_compute_next_size(__n);        pointer __new_start = this->_M_start_of_storage.allocate(__len, __len);        pointer __new_finish = uninitialized_copy(this->_M_Start(), this->_M_Finish(), __new_start);        __new_finish = uninitialized_copy(__first, __last, __new_finish);        _M_construct_null(__new_finish);        this->_M_deallocate_block();        this->_M_reset(__new_start, __new_finish, __new_start + __len);      }      else {        _Traits::assign(*this->_M_finish, *__first++);        uninitialized_copy(__first, __last, this->_M_Finish() + 1);        _M_construct_null(this->_M_Finish() + __n);        this->_M_finish += __n;      }    }    return *this;  }  template <class _Integer>  _Self& _M_append_dispatch(_Integer __n, _Integer __x, const __true_type& /*Integral*/)  { return append((size_type) __n, (_CharT) __x); }  template <class _InputIter>  _Self& _M_append_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*Integral*/)  { return _M_appendT(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter)); }public:  // Check to see if _InputIterator is an integer type.  If so, then  // it can't be an iterator.  template <class _InputIter>  _Self& append(_InputIter __first, _InputIter __last) {    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;    return _M_append_dispatch(__first, __last, _Integral());  }#elsepublic:  _Self& append(const _CharT* __first, const _CharT* __last) {    _STLP_FIX_LITERAL_BUG(__first)_STLP_FIX_LITERAL_BUG(__last)    return _M_append(__first, __last);  }#endifpublic:  _Self& append(const _Self& __s)  { return _M_append(__s._M_Start(), __s._M_Finish()); }  _Self& append(const _Self& __s,                size_type __pos, size_type __n) {    if (__pos > __s.size())      this->_M_throw_out_of_range();    return _M_append(__s._M_Start() + __pos,                     __s._M_Start() + __pos + (min) (__n, __s.size() - __pos));  }  _Self& append(const _CharT* __s, size_type __n)  { _STLP_FIX_LITERAL_BUG(__s) return _M_append(__s, __s+__n); }  _Self& append(const _CharT* __s)  { _STLP_FIX_LITERAL_BUG(__s) return _M_append(__s, __s + traits_type::length(__s)); }  _Self& append(size_type __n, _CharT __c);public:  void push_back(_CharT __c) {    if (this->_M_rest() == 1 )      _M_reserve(_M_compute_next_size(1));    _M_construct_null(this->_M_Finish() + 1);    _Traits::assign(*(this->_M_Finish()), __c);    ++this->_M_finish;  }  void pop_back() {    _Traits::assign(*(this->_M_Finish() - 1), _M_null());    --this->_M_finish;  }public:                         // Assign  _Self& assign(const _Self& __s)  { return _M_assign(__s._M_Start(), __s._M_Finish()); }  _Self& assign(const _Self& __s,                size_type __pos, size_type __n) {    if (__pos > __s.size())      this->_M_throw_out_of_range();    return _M_assign(__s._M_Start() + __pos,                     __s._M_Start() + __pos + (min) (__n, __s.size() - __pos));  }  _Self& assign(const _CharT* __s, size_type __n)  { _STLP_FIX_LITERAL_BUG(__s) return _M_assign(__s, __s + __n); }  _Self& assign(const _CharT* __s)  { _STLP_FIX_LITERAL_BUG(__s) return _M_assign(__s, __s + _Traits::length(__s)); }  _Self& assign(size_type __n, _CharT __c);private:  _Self& _M_assign(const _CharT* __f, const _CharT* __l);#if defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)  // Helper functions for assign.  template <class _Integer>  _Self& _M_assign_dispatch(_Integer __n, _Integer __x, const __true_type& /*_Integral*/)  { return assign((size_type) __n, (_CharT) __x); }  template <class _InputIter>  _Self& _M_assign_dispatch(_InputIter __f, _InputIter __l, const __false_type& /*_Integral*/) {    pointer __cur = this->_M_Start();    while (__f != __l && __cur != this->_M_Finish()) {      _Traits::assign(*__cur, *__f);      ++__f;      ++__cur;    }    if (__f == __l)      erase(__cur, this->end());    else      _M_appendT(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));    return *this;  }public:  // Check to see if _InputIterator is an integer type.  If so, then  // it can't be an iterator.  template <class _InputIter>  _Self& assign(_InputIter __first, _InputIter __last) {    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;    return _M_assign_dispatch(__first, __last, _Integral());  }#elsepublic:  _Self& assign(const _CharT* __f, const _CharT* __l) {    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)    return _M_assign(__f, __l);  }#endifpublic:                         // Insert  _Self& insert(size_type __pos, const _Self& __s) {    if (__pos > size())      this->_M_throw_out_of_range();    if (__s.size() > max_size() - size())      this->_M_throw_length_error();    _M_insert(begin() + __pos, __s._M_Start(), __s._M_Finish(), &__s == this);    return *this;  }  _Self& insert(size_type __pos, const _Self& __s,                size_type __beg, size_type __n) {    if (__pos > size() || __beg > __s.size())      this->_M_throw_out_of_range();    size_type __len = (min) (__n, __s.size() - __beg);    if (__len > max_size() - size())      this->_M_throw_length_error();    _M_insert(begin() + __pos,              __s._M_Start() + __beg, __s._M_Start() + __beg + __len, &__s == this);    return *this;  }  _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {    _STLP_FIX_LITERAL_BUG(__s)    if (__pos > size())      this->_M_throw_out_of_range();    if (__n > max_size() - size())      this->_M_throw_length_error();    _M_insert(begin() + __pos, __s, __s + __n, _M_inside(__s));    return *this;  }  _Self& insert(size_type __pos, const _CharT* __s) {    _STLP_FIX_LITERAL_BUG(__s)    if (__pos > size())      this->_M_throw_out_of_range();    size_type __len = _Traits::length(__s);    if (__len > max_size() - size())      this->_M_throw_length_error();    _M_insert(this->_M_Start() + __pos, __s, __s + __len, _M_inside(__s));    return *this;  }  _Self& insert(size_type __pos, size_type __n, _CharT __c) {    if (__pos > size())      this->_M_throw_out_of_range();    if (__n > max_size() - size())      this->_M_throw_length_error();    insert(begin() + __pos, __n, __c);    return *this;  }  iterator insert(iterator __p, _CharT __c) {    _STLP_FIX_LITERAL_BUG(__p)    if (__p == end()) {      push_back(__c);      return this->_M_Finish() - 1;    }    else      return _M_insert_aux(__p, __c);  }  void insert(iterator __p, size_t __n, _CharT __c);_STLP_PRIVATE:  // Helper functions for insert.  void _M_insert(iterator __p, const _CharT* __first, const _CharT* __last, bool __self_ref);  pointer _M_insert_aux(pointer, _CharT);  void _M_copy(const _CharT* __f, const _CharT* __l, _CharT* __res) {    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)    _STLP_FIX_LITERAL_BUG(__res)    _Traits::copy(__res, __f, __l - __f);  }  void _M_move(const _CharT* __f, const _CharT* __l, _CharT* __res) {    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)    _Traits::move(__res, __f, __l - __f);  }#if defined (_STLP_MEMBER_TEMPLATES)#  if !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)  template <class _ForwardIter>  void _M_insert_overflow(iterator __pos, _ForwardIter __first, _ForwardIter __last,                          size_type __n) {    size_type __len = _M_compute_next_size(__n);    pointer __new_start = this->_M_start_of_storage.allocate(__len, __len);    pointer __new_finish = uninitialized_copy(this->_M_Start(), __pos, __new_start);    __new_finish = uninitialized_copy(__first, __last, __new_finish);    __new_finish = uninitialized_copy(__pos, this->_M_Finish(), __new_finish);    _M_construct_null(__new_finish);    this->_M_deallocate_block();    this->_M_reset(__new_start, __new_finish, __new_start + __len);  }  template <class _InputIter>  void _M_insertT(iterator __p, _InputIter __first, _InputIter __last,                  const input_iterator_tag &) {    for ( ; __first != __last; ++__first) {      __p = insert(__p, *__first);      ++__p;    }  }  template <class _ForwardIter>  void _M_insertT(iterator __pos, _ForwardIter __first, _ForwardIter __last,                  const forward_iterator_tag &) {    if (__first != __last) {      size_type __n = _STLP_STD::distance(__first, __last);      if (__n < this->_M_rest()) {        const size_type __elems_after = this->_M_finish - __pos;        if (__elems_after >= __n) {          uninitialized_copy((this->_M_Finish() - __n) + 1, this->_M_Finish() + 1, this->_M_Finish() + 1);          this->_M_finish += __n;          _Traits::move(__pos + __n, __pos, (__elems_after - __n) + 1);          _M_copyT(__first, __last, __pos);        }        else {          pointer __old_finish = this->_M_Finish();          _ForwardIter __mid = __first;          _STLP_STD::advance(__mid, __elems_after + 1);          _STLP_STD::uninitialized_copy(__mid, __last, this->_M_Finish() + 1);          this->_M_finish += __n - __elems_after;          uninitialized_copy(__pos, __old_finish + 1, this->_M_Finish());          this->_M_finish += __elems_after;          _M_copyT(__first, __mid, __pos);        }      }      else {        _M_insert_overflow(__pos, __first, __last, __n);      }    }  }  template <class _Integer>  void _M_insert_dispatch(iterator __p, _Integer __n, _Integer __x,                          const __true_type& /*Integral*/)  { insert(__p, (size_type) __n, (_CharT) __x); }  template <class _InputIter>  void _M_insert_dispatch(iterator __p, _InputIter __first, _InputIter __last,                          const __false_type& /*Integral*/) {    _STLP_FIX_LITERAL_BUG(__p)    /* We are forced to do a temporary string to avoid the self referencing issue. */    const _Self __self(__first, __last, get_allocator());    _M_insertT(__p, __self.begin(), __self.end(), forward_iterator_tag());  }  template <class _InputIterator>  void _M_copyT(_InputIterator __first, _InputIterator __last, pointer __result) {    _STLP_FIX_LITERAL_BUG(__result)    for ( ; __first != __last; ++__first, ++__result)      _Traits::assign(*__result, *__first);  }#    if !defined (_STLP_NO_METHOD_SPECIALIZATION)  void _M_copyT(const _CharT* __f, const _CharT* __l, _CharT* __res) {    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)    _STLP_FIX_LITERAL_BUG(__res)    _Traits::copy(__res, __f, __l - __f);  }#    endifpublic:  // Check to see if _InputIterator is an integer type.  If so, then  // it can't be an iterator.  template <class _InputIter>  void insert(iterator __p, _InputIter __first, _InputIter __last) {    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;    _M_insert_dispatch(__p, __first, __last, _Integral());  }#  endif#endif#if !defined (_STLP_MEMBER_TEMPLATES) || !defined (_STLP_NO_METHOD_SPECIALIZATION)public:  void insert(iterator __p, const _CharT* __f, const _CharT* __l) {    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)    _M_insert(__p, __f, __l, _M_inside(__f));  }#endifpublic:                         // Erase.  _Self& erase(size_type __pos = 0, size_type __n = npos) {    if (__pos > size())      this->_M_throw_out_of_range();

⌨️ 快捷键说明

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