?? xstring
字號:
const_iterator begin() const
{return (_Ptr); }
iterator end()
{_Freeze();
return ((iterator)_Psum(_Ptr, _Len)); }
const_iterator end() const
{return ((const_iterator)_Psum(_Ptr, _Len)); }
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())); }
reference at(size_type _P0)
{if (_Len <= _P0)
_Xran();
_Freeze();
return (_Ptr[_P0]); }
const_reference at(size_type _P0) const
{if (_Len <= _P0)
_Xran();
return (_Ptr[_P0]); }
reference operator[](size_type _P0)
{if (_Len < _P0 || _Ptr == 0)
return ((reference)*_Nullstr());
_Freeze();
return (_Ptr[_P0]); }
const_reference operator[](size_type _P0) const
{if (_Ptr == 0)
return (*_Nullstr());
else
return (_Ptr[_P0]); }
const _E *c_str() const
{return (_Ptr == 0 ? _Nullstr() : _Ptr); }
const _E *data() const
{return (c_str()); }
size_type length() const
{return (_Len); }
size_type size() const
{return (_Len); }
size_type max_size() const
{size_type _N = allocator.max_size();
return (_N <= 2 ? 1 : _N - 2); }
void resize(size_type _N, _E _C)
{_N <= _Len ? erase(_N) : append(_N - _Len, _C); }
void resize(size_type _N)
{_N <= _Len ? erase(_N) : append(_N - _Len, _E(0)); }
size_type capacity() const
{return (_Res); }
void reserve(size_type _N = 0)
{if (_Res < _N)
_Grow(_N); }
bool empty() const
{return (_Len == 0); }
size_type copy(_E *_S, size_type _N, size_type _P0 = 0) const
{if (_Len < _P0)
_Xran();
if (_Len - _P0 < _N)
_N = _Len - _P0;
if (0 < _N)
_Tr::copy(_S, _Ptr + _P0, _N);
return (_N); }
void swap(_Myt& _X)
{if (allocator == _X.allocator)
{std::swap(_Ptr, _X._Ptr);
std::swap(_Len, _X._Len);
std::swap(_Res, _X._Res); }
else
{_Myt _Ts = *this; *this = _X, _X = _Ts; }}
friend void swap(_Myt& _X, _Myt& _Y)
{_X.swap(_Y); }
size_type find(const _Myt& _X, size_type _P = 0) const
{return (find(_X.c_str(), _P, _X.size())); }
size_type find(const _E *_S, size_type _P,
size_type _N) const
{if (_N == 0 && _P <= _Len)
return (_P);
size_type _Nm;
if (_P < _Len && _N <= (_Nm = _Len - _P))
{const _E *_U, *_V;
for (_Nm -= _N - 1, _V = _Ptr + _P;
(_U = _Tr::find(_V, _Nm, *_S)) != 0;
_Nm -= _U - _V + 1, _V = _U + 1)
if (_Tr::compare(_U, _S, _N) == 0)
return (_U - _Ptr); }
return (npos); }
size_type find(const _E *_S, size_type _P = 0) const
{return (find(_S, _P, _Tr::length(_S))); }
size_type find(_E _C, size_type _P = 0) const
{return (find((const _E *)&_C, _P, 1)); }
size_type rfind(const _Myt& _X, size_type _P = npos) const
{return (rfind(_X.c_str(), _P, _X.size())); }
size_type rfind(const _E *_S, size_type _P,
size_type _N) const
{if (_N == 0)
return (_P < _Len ? _P : _Len);
if (_N <= _Len)
for (const _E *_U = _Ptr +
+ (_P < _Len - _N ? _P : _Len - _N); ; --_U)
if (_Tr::eq(*_U, *_S)
&& _Tr::compare(_U, _S, _N) == 0)
return (_U - _Ptr);
else if (_U == _Ptr)
break;
return (npos); }
size_type rfind(const _E *_S, size_type _P = npos) const
{return (rfind(_S, _P, _Tr::length(_S))); }
size_type rfind(_E _C, size_type _P = npos) const
{return (rfind((const _E *)&_C, _P, 1)); }
size_type find_first_of(const _Myt& _X,
size_type _P = 0) const
{return (find_first_of(_X.c_str(), _P, _X.size())); }
size_type find_first_of(const _E *_S, size_type _P,
size_type _N) const
{if (0 < _N && _P < _Len)
{const _E *const _V = _Ptr + _Len;
for (const _E *_U = _Ptr + _P; _U < _V; ++_U)
if (_Tr::find(_S, _N, *_U) != 0)
return (_U - _Ptr); }
return (npos); }
size_type find_first_of(const _E *_S, size_type _P = 0) const
{return (find_first_of(_S, _P, _Tr::length(_S))); }
size_type find_first_of(_E _C, size_type _P = 0) const
{return (find((const _E *)&_C, _P, 1)); }
size_type find_last_of(const _Myt& _X,
size_type _P = npos) const
{return (find_last_of(_X.c_str(), _P, _X.size())); }
size_type find_last_of(const _E *_S, size_type _P,
size_type _N) const
{if (0 < _N && 0 < _Len)
for (const _E *_U = _Ptr
+ (_P < _Len ? _P : _Len - 1); ; --_U)
if (_Tr::find(_S, _N, *_U) != 0)
return (_U - _Ptr);
else if (_U == _Ptr)
break;
return (npos); }
size_type find_last_of(const _E *_S,
size_type _P = npos) const
{return (find_last_of(_S, _P, _Tr::length(_S))); }
size_type find_last_of(_E _C, size_type _P = npos) const
{return (rfind((const _E *)&_C, _P, 1)); }
size_type find_first_not_of(const _Myt& _X,
size_type _P = 0) const
{return (find_first_not_of(_X.c_str(), _P,
_X.size())); }
size_type find_first_not_of(const _E *_S, size_type _P,
size_type _N) const
{if (_P < _Len)
{const _E *const _V = _Ptr + _Len;
for (const _E *_U = _Ptr + _P; _U < _V; ++_U)
if (_Tr::find(_S, _N, *_U) == 0)
return (_U - _Ptr); }
return (npos); }
size_type find_first_not_of(const _E *_S,
size_type _P = 0) const
{return (find_first_not_of(_S, _P, _Tr::length(_S))); }
size_type find_first_not_of(_E _C, size_type _P = 0) const
{return (find_first_not_of((const _E *)&_C, _P, 1)); }
size_type find_last_not_of(const _Myt& _X,
size_type _P = npos) const
{return (find_last_not_of(_X.c_str(), _P, _X.size())); }
size_type find_last_not_of(const _E *_S, size_type _P,
size_type _N) const
{if (0 < _Len)
for (const _E *_U = _Ptr
+ (_P < _Len ? _P : _Len - 1); ; --_U)
if (_Tr::find(_S, _N, *_U) == 0)
return (_U - _Ptr);
else if (_U == _Ptr)
break;
return (npos); }
size_type find_last_not_of(const _E *_S,
size_type _P = npos) const
{return (find_last_not_of(_S, _P, _Tr::length(_S))); }
size_type find_last_not_of(_E _C, size_type _P = npos) const
{return (find_last_not_of((const _E *)&_C, _P, 1)); }
_Myt substr(size_type _P = 0, size_type _M = npos) const
{return (_Myt(*this, _P, _M)); }
int compare(const _Myt& _X) const
{return (compare(0, _Len, _X.c_str(), _X.size())); }
int compare(size_type _P0, size_type _N0,
const _Myt& _X) const
{return (compare(_P0, _N0, _X, 0, npos)); }
int compare(size_type _P0, size_type _N0, const _Myt& _X,
size_type _P, size_type _M) const
{if (_X.size() < _P)
_Xran();
if (_X._Len - _P < _M)
_M = _X._Len - _P;
return (compare(_P0, _N0, _X.c_str() + _P, _M)); }
int compare(const _E *_S) const
{return (compare(0, _Len, _S, _Tr::length(_S))); }
int compare(size_type _P0, size_type _N0, const _E *_S) const
{return (compare(_P0, _N0, _S, _Tr::length(_S))); }
int compare(size_type _P0, size_type _N0, const _E *_S,
size_type _M) const
{if (_Len < _P0)
_Xran();
if (_Len - _P0 < _N0)
_N0 = _Len - _P0;
size_type _Ans = _Tr::compare(_Psum(_Ptr, _P0), _S,
_N0 < _M ? _N0 : _M);
return (_Ans != 0 ? _Ans : _N0 < _M ? -1
: _N0 == _M ? 0 : +1); }
_A get_allocator() const
{return (allocator); }
protected:
_A allocator;
private:
enum {_MIN_SIZE = sizeof (_E) <= 32 ? 31 : 7};
void _Copy(size_type _N)
{size_type _Ns = _N | _MIN_SIZE;
if (max_size() < _Ns)
_Ns = _N;
_E *_S;
_TRY_BEGIN
_S = allocator.allocate(_Ns + 2, (void *)0);
_CATCH_ALL
_Ns = _N;
_S = allocator.allocate(_Ns + 2, (void *)0);
_CATCH_END
if (0 < _Len)
_Tr::copy(_S + 1, _Ptr, _Len);
size_type _Olen = _Len;
_Tidy(true);
_Ptr = _S + 1;
_Refcnt(_Ptr) = 0;
_Res = _Ns;
_Eos(_Olen); }
void _Eos(size_type _N)
{_Tr::assign(_Ptr[_Len = _N], _E(0)); }
void _Freeze()
{if (_Ptr != 0
&& _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN)
_Grow(_Len);
if (_Ptr != 0)
_Refcnt(_Ptr) = _FROZEN; }
bool _Grow(size_type _N, bool _Trim = false)
{if (max_size() < _N)
_Xlen();
if (_Trim)
_Len = 0;
else if (_N < _Len)
_Len = _N;
if (_Ptr != 0
&& _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN)
if (_N == 0)
{_Tidy(true);
return (false); }
else
{_Copy(_N);
return (true); }
if (_N == 0)
{if (_Trim)
_Tidy(true);
else if (_Ptr != 0)
_Eos(0);
return (false); }
else
{if (_Trim && (_MIN_SIZE < _Res || _Res < _N))
{_Tidy(true);
_Copy(_N); }
else if (!_Trim && _Res < _N)
_Copy(_N);
return (true); }}
static const _E * __cdecl _Nullstr()
{static const _E _C = _E(0);
return (&_C); }
static size_type _Pdif(const_pointer _P2, const_pointer _P1)
{return (_P2 == 0 ? 0 : _P2 - _P1); }
static const_pointer _Psum(const_pointer _P, size_type _N)
{return (_P == 0 ? 0 : _P + _N); }
static pointer _Psum(pointer _P, size_type _N)
{return (_P == 0 ? 0 : _P + _N); }
unsigned char& _Refcnt(const _E *_U)
{return (((unsigned char *)_U)[-1]); }
void _Tidy(bool _Built = false)
{if (!_Built || _Ptr == 0)
;
else if (_Refcnt(_Ptr) == 0 || _Refcnt(_Ptr) == _FROZEN)
allocator.deallocate(_Ptr - 1, _Res + 2);
else
--_Refcnt(_Ptr);
_Ptr = 0, _Len = 0, _Res = 0; }
_E *_Ptr;
size_type _Len, _Res;
};
template<class _E, class _Tr, class _A>
const basic_string<_E, _Tr, _A>::size_type
basic_string<_E, _Tr, _A>::npos = -1;
#ifdef _DLL
#pragma warning(disable:4231) /* the extern before template is a non-standard extension */
extern template class _CRTIMP basic_string<char, char_traits<char>, allocator<char> >;
extern template class _CRTIMP basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
#pragma warning(default:4231) /* restore previous warning */
#endif
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
typedef basic_string<wchar_t, char_traits<wchar_t>,
allocator<wchar_t> > wstring;
_STD_END
#ifdef _MSC_VER
#pragma pack(pop)
#endif /* _MSC_VER */
#endif /* _XSTRING */
/*
* Copyright (c) 1995-1998 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -