📄 _string.h
字号:
# if !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND) _Self& assign(const _CharT* __f, const _CharT* __l) { _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l) return _M_assign(__f, __l); }# endif#endifpublic: // Insert _Self& insert(size_type __pos, const _Self& __s) { if (__pos > size()) this->_M_throw_out_of_range(); if (size() > max_size() - __s.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 (size() > max_size() - __len) 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 (size() > max_size() - __n) 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 (size() > max_size() - __len) 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 (size() > max_size() - __n) 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);protected: // 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, difference_type __n) { const size_type __old_size = this->size(); size_type __len = __old_size + (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1; pointer __new_start = this->_M_end_of_storage.allocate(__len, __len); pointer __new_finish = __new_start; _STLP_TRY { __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); } _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish), this->_M_end_of_storage.deallocate(__new_start, __len))) this->_M_destroy_range(); 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) { difference_type __n = distance(__first, __last); if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) { const difference_type __elems_after = this->_M_finish - __pos; if (__elems_after >= __n) {# if defined (_STLP_USE_SHORT_STRING_OPTIM) if (this->_M_using_static_buf()) _M_copy((this->_M_Finish() - __n) + 1, this->_M_Finish() + 1, this->_M_Finish() + 1); else# endif /* _STLP_USE_SHORT_STRING_OPTIM */ 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; advance(__mid, __elems_after + 1);# if defined (_STLP_USE_SHORT_STRING_OPTIM) if (this->_M_using_static_buf()) _M_copyT(__mid, __last, this->_M_Finish() + 1); else# endif /* _STLP_USE_SHORT_STRING_OPTIM */ uninitialized_copy(__mid, __last, this->_M_Finish() + 1); this->_M_finish += __n - __elems_after; _STLP_TRY {# if defined (_STLP_USE_SHORT_STRING_OPTIM) if (this->_M_using_static_buf()) _M_copy(__pos, __old_finish + 1, this->_M_Finish()); else# endif /* _STLP_USE_SHORT_STRING_OPTIM */ uninitialized_copy(__pos, __old_finish + 1, this->_M_Finish()); this->_M_finish += __elems_after; } _STLP_UNWIND((this->_M_destroy_ptr_range(__old_finish + 1, this->_M_Finish()), this->_M_finish = __old_finish)) _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) /* * Within the basic_string implementation we are only going to check for * self referencing if iterators are string iterators or _CharT pointers. * A user could encapsulate those iterator within their own iterator interface * and in this case lead to a bad behavior, this is a known limitation. */ typedef typename _AreSameUnCVTypes<_InputIter, iterator>::_Ret _IsIterator; typedef typename _AreSameUnCVTypes<_InputIter, const_iterator>::_Ret _IsConstIterator; typedef typename _Lor2<_IsIterator, _IsConstIterator>::_Ret _CheckInside; _M_insert_aux(__p, __first, __last, _CheckInside()); } template <class _RandomIter> void _M_insert_aux (iterator __p, _RandomIter __first, _RandomIter __last, const __true_type& /*_CheckInside*/) { _STLP_FIX_LITERAL_BUG(__p) _M_insert(__p, &(*__first), &(*__last), _M_inside(&(*__first))); } template<class _InputIter> void _M_insert_aux (iterator __p, _InputIter __first, _InputIter __last, const __false_type& /*_CheckInside*/) { _STLP_FIX_LITERAL_BUG(__p) _M_insertT(__p, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); } 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#endifpublic:#if !defined (_STLP_MEMBER_TEMPLATES) || \ !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS) 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(); erase(begin() + __pos, begin() + __pos + (min) (__n, size() - __pos)); return *this; } iterator erase(iterator __pos) { // The move includes the terminating _CharT(). _Traits::move(__pos, __pos + 1, this->_M_Finish() - __pos); this->_M_destroy_back(); --this->_M_finish; return __pos; } iterator erase(iterator __first, iterator __last) { if (__first != __last) { // The move includes the terminating _CharT(). traits_type::move(__first, __last, (this->_M_Finish() - __last) + 1); pointer __new_finish = this->_M_Finish() - (__last - __first); this->_M_destroy_ptr_range(__new_finish + 1, this->_M_Finish() + 1); this->_M_finish = __new_finish; } return __first; }public: // Replace. (Conceptually equivalent // to erase followed by insert.) _Self& replace(size_type __pos, size_type __n, const _Self& __s) { if (__pos > size()) this->_M_throw_out_of_range(); const size_type __len = (min) (__n, size() - __pos); if (size() - __len >= max_size() - __s.size()) this->_M_throw_length_error(); return _M_replace(begin() + __pos, begin() + __pos + __len, __s._M_Start(), __s._M_Finish(), &__s == this); } _Self& replace(size_type __pos1, size_type __n1, const _Self& __s, size_type __pos2, size_type __n2) { if (__pos1 > size() || __pos2 > __s.size()) this->_M_throw_out_of_range(); const size_type __len1 = (min) (__n1, size() - __pos1); const size_type __len2 = (min) (__n2, __s.size() - __pos2); if (size() - __len1 >= max_size() - __len2) this->_M_throw_length_error(); return _M_replace(begin() + __pos1, begin() + __pos1 + __len1, __s._M_Start() + __pos2, __s._M_Start() + __pos2 + __len2, &__s == this); } _Self& replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2) { _STLP_FIX_LITERAL_BUG(__s) if (__pos > size()) this->_M_throw_out_of_range(); const size_type __len = (min) (__n1, size() - __pos); if (__n2 > max_size() || size() - __len >= max_size() - __n2) this->_M_throw_length_error(); return _M_replace(begin() + __pos, begin() + __pos + __len, __s, __s + __n2, _M_inside(__s)); } _Self& replace(size_type __pos, size_type __n1, const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) if (__pos > size()) this->_M_throw_out_of_range(); const size_type __len = (min) (__n1, size() - __pos); const size_type __n2 = _Traits::length(__s); if (__n2 > max_size() || size() - __len >= max_size() - __n2) this->_M_throw_length_error(); return _M_replace(begin() + __pos, begin() + __pos + __len, __s, __s + _Traits::length(__s), _M_inside(__s)); } _Self& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) { if (__pos > size()) this->_M_throw_out_of_range(); const size_type __len = (min) (__n1, size() - __pos); if (__n2 > max_size() || size() - __len >= max_size() - __n2) this->_M_throw_length_error(); return replace(begin() + __pos, begin() + __pos + __len, __n2, __c); } _Self& replace(iterator __first, iterator __last, const _Self& __s) { _STLP_FIX_LITERAL_BUG(__first)_STLP_FIX_LITERAL_BUG(__last) return _M_replace(__first, __last, __s._M_Start(), __s._M_Finish(), &__s == this); } _Self& replace(iterator __first, iterator __last, const _CharT* __s, size_type __n) { _STLP_FIX_LITERAL_BUG(__first)_STLP_FIX_LITERAL_BUG(__last) _STLP_FIX_LITERAL_BUG(__s) return _M_replace(__first, __last, __s, __s + __n, _M_inside(__s)); } _Self& replace(iterator __first, iterator __last, const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__first)_STLP_FIX_LITERAL_BUG(__last) _STLP_FIX_LITERAL_BUG(__s) return _M_replace(__first, __last, __s, __s + _Traits::length(__s), _M_inside(__s)); } _Self& replace(iterator __first, iterator __last, size_type __n, _CharT __c);protected: // Helper functions for replace. _Self& _M_replace(iterator __first, iterator __last, const _CharT* __f, const _CharT* __l, bool __self_ref);public:#if defined (_STLP_MEMBER_TEMPLATES)# if !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -