📄 xstring
字号:
_Xlen(); // result too long
size_type _Num;
if (0 < _Count && _Grow(_Num = this->_Mysize + _Count))
{ // make room and insert new stuff
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off, this->_Mysize - _Off); // empty out hole
_Chassign(_Off, _Count, _Ch); // fill hole
_Eos(_Num);
}
return (*this);
}
iterator insert(const_iterator _Where)
{ // insert <null> at _Where
return (insert(_Where, _Elem()));
}
iterator insert(const_iterator _Where, _Elem _Ch)
{ // insert _Ch at _Where
size_type _Off = _Pdif(_Where, begin());
insert(_Off, 1, _Ch);
return (begin() + _Off);
}
void insert(const_iterator _Where, size_type _Count, _Elem _Ch)
{ // insert _Count * _Elem at _Where
size_type _Off = _Pdif(_Where, begin());
insert(_Off, _Count, _Ch);
}
template<class _It>
void insert(const_iterator _Where, _It _First, _It _Last)
{ // insert [_First, _Last) at _Where
_Insert(_Where, _First, _Last, _Iter_cat(_First));
}
template<class _It>
void _Insert(const_iterator _Where, _It _Count, _It _Ch,
_Int_iterator_tag)
{ // insert _Count * _Ch at _Where
insert(_Where, (size_type)_Count, (_Elem)_Ch);
}
template<class _It>
void _Insert(const_iterator _Where, _It _First, _It _Last,
input_iterator_tag)
{ // insert [_First, _Last) at _Where, input iterators
replace(_Where, _Where, _First, _Last);
}
void insert(const_iterator _Where,
const_pointer _First, const_pointer _Last)
{ // insert [_First, _Last) at _Where, const pointers
replace(_Where, _Where, _First, _Last);
}
void insert(const_iterator _Where,
const_iterator _First, const_iterator _Last)
{ // insert [_First, _Last) at _Where, const_iterators
replace(_Where, _Where, _First, _Last);
}
_Myt& erase(size_type _Off = 0,
size_type _Count = npos)
{ // erase elements [_Off, _Off + _Count)
if (this->_Mysize < _Off)
_Xran(); // _Off off end
if (this->_Mysize - _Off < _Count)
_Count = this->_Mysize - _Off; // trim _Count
if (0 < _Count)
{ // move elements down
_Traits::move(_Myptr() + _Off, _Myptr() + _Off + _Count,
this->_Mysize - _Off - _Count);
size_type _Newsize = this->_Mysize - _Count;
_Eos(_Newsize);
}
return (*this);
}
iterator erase(const_iterator _Where)
{ // erase element at _Where
size_type _Count = _Pdif(_Where, begin());
erase(_Count, 1);
return (_STRING_ITERATOR(_Myptr() + _Count));
}
iterator erase(const_iterator _First, const_iterator _Last)
{ // erase substring [_First, _Last)
size_type _Count = _Pdif(_First, begin());
erase(_Count, _Pdif(_Last, _First));
return (_STRING_ITERATOR(_Myptr() + _Count));
}
void clear()
{ // erase all
_Eos(0);
}
_Myt& replace(size_type _Off, size_type _N0, const _Myt& _Right)
{ // replace [_Off, _Off + _N0) with _Right
return (replace(_Off, _N0, _Right, 0, npos));
}
_Myt& replace(size_type _Off,
size_type _N0, const _Myt& _Right, size_type _Roff, size_type _Count)
{ // replace [_Off, _Off + _N0) with _Right [_Roff, _Roff + _Count)
if (this->_Mysize < _Off || _Right.size() < _Roff)
_Xran(); // _Off or _Roff off end
if (this->_Mysize - _Off < _N0)
_N0 = this->_Mysize - _Off; // trim _N0 to size
size_type _Num = _Right.size() - _Roff;
if (_Num < _Count)
_Count = _Num; // trim _Count to size
if (npos - _Count <= this->_Mysize - _N0)
_Xlen(); // result too long
size_type _Nm = this->_Mysize - _N0 - _Off; // length of kept tail
size_type _Newsize = this->_Mysize + _Count - _N0;
if (this->_Mysize < _Newsize)
_Grow(_Newsize);
if (this != &_Right)
{ // no overlap, just move down and copy in new stuff
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // empty hole
_Traits::copy(_Myptr() + _Off,
_Right._Myptr() + _Roff, _Count); // fill hole
}
else if (_Count <= _N0)
{ // hole doesn't get larger, just copy in substring
_Traits::move(_Myptr() + _Off,
_Myptr() + _Roff, _Count); // fill hole
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // move tail down
}
else if (_Roff <= _Off)
{ // hole gets larger, substring begins before hole
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // move tail down
_Traits::move(_Myptr() + _Off,
_Myptr() + _Roff, _Count); // fill hole
}
else if (_Off + _N0 <= _Roff)
{ // hole gets larger, substring begins after hole
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // move tail down
_Traits::move(_Myptr() + _Off,
_Myptr() + (_Roff + _Count - _N0), _Count); // fill hole
}
else
{ // hole gets larger, substring begins in hole
_Traits::move(_Myptr() + _Off,
_Myptr() + _Roff, _N0); // fill old hole
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // move tail down
_Traits::move(_Myptr() + _Off + _N0, _Myptr() + _Roff + _Count,
_Count - _N0); // fill rest of new hole
}
_Eos(_Newsize);
return (*this);
}
_Myt& replace(size_type _Off,
size_type _N0, const _Elem *_Ptr, size_type _Count)
{ // replace [_Off, _Off + _N0) with [_Ptr, _Ptr + _Count)
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Count != 0)
_DEBUG_POINTER(_Ptr);
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
if (_Inside(_Ptr))
return (replace(_Off, _N0, *this,
_Ptr - _Myptr(), _Count)); // substring, replace carefully
if (this->_Mysize < _Off)
_Xran(); // _Off off end
if (this->_Mysize - _Off < _N0)
_N0 = this->_Mysize - _Off; // trim _N0 to size
if (npos - _Count <= this->_Mysize - _N0)
_Xlen(); // result too long
size_type _Nm = this->_Mysize - _N0 - _Off;
if (_Count < _N0)
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // smaller hole, move tail up
size_type _Num;
if ((0 < _Count || 0 < _N0)
&& _Grow(_Num = this->_Mysize + _Count - _N0))
{ // make room and rearrange
if (_N0 < _Count)
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // move tail down
_Traits::copy(_Myptr() + _Off, _Ptr, _Count); // fill hole
_Eos(_Num);
}
return (*this);
}
_Myt& replace(size_type _Off, size_type _N0, const _Elem *_Ptr)
{ // replace [_Off, _Off + _N0) with [_Ptr, <null>)
_DEBUG_POINTER(_Ptr);
return (replace(_Off, _N0, _Ptr, _Traits::length(_Ptr)));
}
_Myt& replace(size_type _Off,
size_type _N0, size_type _Count, _Elem _Ch)
{ // replace [_Off, _Off + _N0) with _Count * _Ch
if (this->_Mysize < _Off)
_Xran(); // _Off off end
if (this->_Mysize - _Off < _N0)
_N0 = this->_Mysize - _Off; // trim _N0 to size
if (npos - _Count <= this->_Mysize - _N0)
_Xlen(); // result too long
size_type _Nm = this->_Mysize - _N0 - _Off;
if (_Count < _N0)
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // smaller hole, move tail up
size_type _Num;
if ((0 < _Count || 0 < _N0)
&& _Grow(_Num = this->_Mysize + _Count - _N0))
{ // make room and rearrange
if (_N0 < _Count)
_Traits::move(_Myptr() + _Off + _Count,
_Myptr() + _Off + _N0, _Nm); // move tail down
_Chassign(_Off, _Count, _Ch); // fill hole
_Eos(_Num);
}
return (*this);
}
_Myt& replace(const_iterator _First, const_iterator _Last,
const _Myt& _Right)
{ // replace [_First, _Last) with _Right
return (replace(
_Pdif(_First, begin()), _Pdif(_Last, _First), _Right));
}
_Myt& replace(const_iterator _First, const_iterator _Last,
const _Elem *_Ptr, size_type _Count)
{ // replace [_First, _Last) with [_Ptr, _Ptr + _Count)
return (replace(
_Pdif(_First, begin()), _Pdif(_Last, _First), _Ptr, _Count));
}
_Myt& replace(const_iterator _First, const_iterator _Last,
const _Elem *_Ptr)
{ // replace [_First, _Last) with [_Ptr, <null>)
return (replace(
_Pdif(_First, begin()), _Pdif(_Last, _First), _Ptr));
}
_Myt& replace(const_iterator _First, const_iterator _Last,
size_type _Count, _Elem _Ch)
{ // replace [_First, _Last) with _Count * _Ch
return (replace(
_Pdif(_First, begin()), _Pdif(_Last, _First), _Count, _Ch));
}
template<class _It>
_Myt& replace(const_iterator _First, const_iterator _Last,
_It _First2, _It _Last2)
{ // replace [_First, _Last) with [_First2, _Last2)
return (_Replace(_First, _Last,
_First2, _Last2, _Iter_cat(_First2)));
}
template<class _It>
_Myt& _Replace(const_iterator _First, const_iterator _Last,
_It _Count, _It _Ch, _Int_iterator_tag)
{ // replace [_First, _Last) with _Count * _Ch
return (replace(_First, _Last, (size_type)_Count, (_Elem)_Ch));
}
template<class _It>
_Myt& _Replace(const_iterator _First, const_iterator _Last,
_It _First2, _It _Last2, input_iterator_tag)
{ // replace [_First, _Last) with [_First2, _Last2), input iterators
_Myt _Right(_First2, _Last2);
replace(_First, _Last, _Right);
return (*this);
}
_Myt& replace(const_iterator _First, const_iterator _Last,
const_pointer _First2, const_pointer _Last2)
{ // replace [_First, _Last) with [_First2, _Last2), const pointers
if (_First2 == _Last2)
erase(_Pdif(_First, begin()), _Pdif(_Last, _First));
else
replace(_Pdif(_First, begin()), _Pdif(_Last, _First),
&*_First2, _Last2 - _First2);
return (*this);
}
_Myt& replace(const_iterator _First, const_iterator _Last,
const_iterator _First2, const_iterator _Last2)
{ // replace [_First, _Last) with [_First2, _Last2), const_iterators
if (_First2 == _Last2)
erase(_Pdif(_First, begin()), _Pdif(_Last, _First));
else
replace(_Pdif(_First, begin()), _Pdif(_Last, _First),
&*_First2, _Last2 - _First2);
return (*this);
}
iterator begin()
{ // return iterator for beginning of mutable sequence
return (_STRING_ITERATOR(_Myptr()));
}
const_iterator begin() const
{ // return iterator for beginning of nonmutable sequence
return (_STRING_CONST_ITERATOR(_Myptr()));
}
iterator end()
{ // return iterator for end of mutable sequence
return (_STRING_ITERATOR(_Myptr() + this->_Mysize));
}
const_iterator end() const
{ // return iterator for end of nonmutable sequence
return (_STRING_CONST_ITERATOR(_Myptr() + this->_Mysize));
}
reverse_iterator rbegin()
{ // return iterator for beginning of reversed mutable sequence
return (reverse_iterator(end()));
}
const_reverse_iterator rbegin() const
{ // return iterator for beginning of reversed nonmutable sequence
return (const_reverse_iterator(end()));
}
reverse_iterator rend()
{ // return iterator for end of reversed mutable sequence
return (reverse_iterator(begin()));
}
const_reverse_iterator rend() const
{ // return iterator for end of reversed nonmutable sequence
return (const_reverse_iterator(begin()));
}
#if _HAS_CPP0X
const_iterator cbegin() const
{ // return iterator for beginning of nonmutable sequence
return (((const _Myt *)this)->begin());
}
const_iterator cend() const
{ // return iterator for end of nonmutable sequence
return (((const _Myt *)this)->end());
}
const_reverse_iterator crbegin() const
{ // return iterator for beginning of reversed nonmutable sequence
return (((const _Myt *)this)->rbegin());
}
const_reverse_iterator crend() const
{ // return iterator for ebd of reversed nonmutable sequence
return (((const _Myt *)this)->rend());
}
void shrink_to_fit()
{ // reduce capacity
if (size() < capacity())
{ // worth shrinking, do it
_Myt _Tmp(*this);
swap(_Tmp);
}
}
#endif /* _HAS_CPP0X */
reference at(size_type _Off)
{ // subscript mutable sequence with checking
if (this->_Mysize <= _Off)
_Xran(); // _Off off end
return (_Myptr()[_Off]);
}
const_reference at(size_type _Off) const
{ // subscript nonmutable sequence with checking
if (this->_Mysize <= _Off)
_Xran(); // _Off off end
return (_Myptr()[_Off]);
}
reference operator[](size_type _Off)
{ // subscript mutable sequence
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Mysize <= _Off)
_DEBUG_ERROR("string subscript out of range");
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE_RANGE(_Off < this->_Mysize);
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
return (_Myptr()[_Off]);
}
const_reference operator[](size_type _Off) const
{ // subscript nonmutable sequence
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Mysize < _Off) // sic
_DEBUG_ERROR("string subscript out of range");
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE_RANGE(_Off <= this->_Mysize); // sic
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
return (_Myptr()[_Off]);
}
void push_back(_Elem _Ch)
{ // insert element at end
insert(end(), _Ch);
}
#if _HAS_CPP0X
void pop_back()
{ // erase element at end
erase(this->_Mysize - 1); // throws if _Mysize == 0
}
reference front()
{ // return first element of mutable sequence
return (*begin());
}
const_reference front() const
{ // return first element of nonmutable sequence
return (*begin());
}
reference back()
{ // return last element of mutable sequence
return (*(end() - 1));
}
const_reference back() const
{ // return last element of nonmutable sequence
return (*(end() - 1));
}
#endif /* _HAS_CPP0X */
const _Elem *c_str() const
{ // return pointer to null-terminated nonmutable array
return (_Myptr());
}
const _Elem *data() const
{ // return pointer to nonmutable array
return (c_str());
}
size_type length() const
{ // return length of sequence
return (this->_Mysize);
}
size_type size() const
{ // return length of sequence
return (this->_Mysize);
}
size_type max_size() const
{ // return maximum possible length of sequence
size_type _Num = this->_Alval.max_size();
return (_Num <= 1 ? 1 : _Num - 1);
}
void resize(size_type _Newsize)
{ // determine new length, padding with null elements as needed
resize(_Newsize, _Elem());
}
void resize(size_type _Newsize, _Elem _Ch)
{ // determine new length, padding with _Ch elements as needed
if (_Newsize <= this->_Mysize)
erase(_Newsize);
else
append(_Newsize - this->_Mysize, _Ch);
}
size_type capacity() const
{ // return current length of allocated storage
return (this->_Myres);
}
void reserve(size_type _Newcap = 0)
{ // determine new minimum length of allocated storage
if (this->_Mysize <= _Newcap && this->_Myres != _Newcap)
{ // change reservation
size_type _Size = this->_Mysize;
if (_Grow(_Newcap, true))
_Eos(_Size);
}
}
bool empty() const
{ // test if sequence is empty
return (this->_Mysize == 0);
}
_SCL_INSECURE_DEPRECATE
size_type copy(_Elem *_Ptr,
size_type _Count, size_type _Off = 0) const
{ // copy [_Off, _Off + _Count) to [_Ptr, _Ptr + _Count)
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Count != 0)
_DEBUG_POINTER(_Ptr);
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
if (this->_Mysize < _Off)
_Xran(); // _Off off end
if (this->_Mysize - _Off < _Count)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -