📄 string
字号:
// string standard header
#pragma once
#ifndef _STRING_
#define _STRING_
#ifndef RC_INVOKED
#include <istream>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
#pragma warning(disable: 4189)
#pragma warning(disable: 4172)
_STD_BEGIN
// basic_string TEMPLATE OPERATORS
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // return string + string
basic_string<_Elem, _Traits, _Alloc> _Ans;
_Ans.reserve(_Left.size() + _Right.size());
_Ans += _Left;
_Ans += _Right;
return (_Ans);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const _Elem *_Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // return NTCS + string
basic_string<_Elem, _Traits, _Alloc> _Ans;
_Ans.reserve(_Traits::length(_Left) + _Right.size());
_Ans += _Left;
_Ans += _Right;
return (_Ans);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const _Elem _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // return character + string
basic_string<_Elem, _Traits, _Alloc> _Ans;
_Ans.reserve(1 + _Right.size());
_Ans += _Left;
_Ans += _Right;
return (_Ans);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // return string + NTCS
basic_string<_Elem, _Traits, _Alloc> _Ans;
_Ans.reserve(_Left.size() + _Traits::length(_Right));
_Ans += _Left;
_Ans += _Right;
return (_Ans);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem _Right)
{ // return string + character
basic_string<_Elem, _Traits, _Alloc> _Ans;
_Ans.reserve(_Left.size() + 1);
_Ans += _Left;
_Ans += _Right;
return (_Ans);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
basic_string<_Elem, _Traits, _Alloc>&& _Right)
{ // return string + string
return (_STD move(_Right.insert(0, _Left)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
basic_string<_Elem, _Traits, _Alloc>&& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // return string + string
return (_STD move(_Left.append(_Right)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
basic_string<_Elem, _Traits, _Alloc>&& _Left,
basic_string<_Elem, _Traits, _Alloc>&& _Right)
{ // return string + string
if (_Right.size() <= _Left.capacity() - _Left.size()
|| _Right.capacity() - _Right.size() < _Left.size())
return (_STD move(_Left.append(_Right)));
else
return (_STD move(_Right.insert(0, _Left)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const _Elem *_Left,
basic_string<_Elem, _Traits, _Alloc>&& _Right)
{ // return NTCS + string
return (_STD move(_Right.insert(0, _Left)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
const _Elem _Left,
basic_string<_Elem, _Traits, _Alloc>&& _Right)
{ // return character + string
return (_STD move(_Right.insert(0, 1, _Left)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
basic_string<_Elem, _Traits, _Alloc>&& _Left,
const _Elem *_Right)
{ // return string + NTCS
return (_STD move(_Left.append(_Right)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_string<_Elem, _Traits, _Alloc> operator+(
basic_string<_Elem, _Traits, _Alloc>&& _Left,
const _Elem _Right)
{ // return string + character
return (_STD move(_Left.append(1, _Right)));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator==(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test for string equality
return (_Left.compare(_Right) == 0);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator==(
const _Elem * _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test for NTCS vs. string equality
return (_Right.compare(_Left) == 0);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator==(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test for string vs. NTCS equality
return (_Left.compare(_Right) == 0);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator!=(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test for string inequality
return (!(_Left == _Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator!=(
const _Elem *_Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test for NTCS vs. string inequality
return (!(_Left == _Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator!=(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test for string vs. NTCS inequality
return (!(_Left == _Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator<(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if string < string
return (_Left.compare(_Right) < 0);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator<(
const _Elem * _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if NTCS < string
return (_Right.compare(_Left) > 0);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator<(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test if string < NTCS
return (_Left.compare(_Right) < 0);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator>(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if string > string
return (_Right < _Left);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator>(
const _Elem * _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if NTCS > string
return (_Right < _Left);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator>(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test if string > NTCS
return (_Right < _Left);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator<=(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if string <= string
return (!(_Right < _Left));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator<=(
const _Elem * _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if NTCS <= string
return (!(_Right < _Left));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator<=(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test if string <= NTCS
return (!(_Right < _Left));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator>=(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if string >= string
return (!(_Left < _Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator>=(
const _Elem * _Left,
const basic_string<_Elem, _Traits, _Alloc>& _Right)
{ // test if NTCS >= string
return (!(_Left < _Right));
}
template<class _Elem,
class _Traits,
class _Alloc> inline
bool operator>=(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test if string >= NTCS
return (!(_Left < _Right));
}
// basic_string INSERTERS AND EXTRACTORS
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_istream<_Elem, _Traits>& operator>>(
basic_istream<_Elem, _Traits> && _Istr,
basic_string<_Elem, _Traits, _Alloc>& _Str)
{ // extract a string
typedef ctype<_Elem> _Ctype;
typedef basic_istream<_Elem, _Traits> _Myis;
typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
typedef typename _Mystr::size_type _Mysizt;
ios_base::iostate _State = ios_base::goodbit;
bool _Changed = false;
const typename _Myis::sentry _Ok(_Istr);
if (_Ok)
{ // state okay, extract characters
const _Ctype& _Ctype_fac = _USE(_Istr.getloc(), _Ctype);
_Str.erase();
_TRY_IO_BEGIN
_Mysizt _Size = 0 < _Istr.width()
&& (_Mysizt)_Istr.width() < _Str.max_size()
? (_Mysizt)_Istr.width() : _Str.max_size();
typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc())
if(_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else if (_Ctype_fac.is(_Ctype::space,
_Traits::to_char_type(_Meta)))
break; // whitespace, quit
else
{ // add character to string
_Str.append(1, _Traits::to_char_type(_Meta));
_Changed = true;
}
_CATCH_IO_(_Istr)
}
_Istr.width(0);
if (!_Changed)
_State |= ios_base::failbit;
_Istr.setstate(_State);
return (_Istr);
}
template<class _Elem,
class _Traits,
class _Alloc> inline
basic_istream<_Elem, _Traits>& getline(
basic_istream<_Elem, _Traits> && _Istr,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -