?? string.cc
字號:
}
else {
size_type __d = 0;
size_type __rem = size() - __xlen - __pos; // length of bit at the end
// Check for shared representation, insufficient capacity,
if ( (_C_pref()->_C_ref_count () > 1) || (capacity() < __len))
{
// Need to allocate a new reference.
size_t __new_capacity = max (_RW::__rw_new_capacity (size(), this),
size_t (__len));
_C_string_ref_type * __temp = _C_getRep(__new_capacity, __len);
if (__pos) traits_type::copy(__temp->data(), _C_data, __pos);
for (__d = 0; __d < (size_type)__n2; __d++)
traits_type::assign (*(__temp->data()+__pos+__d), *__first2++);
if (__rem)
traits_type::copy (__temp->data () + __pos + __n2,
_C_data + __pos + __n, __rem);
_C_unlink();
_C_data = __temp->data();
}
else
{
// Current reference has enough room.
if (__rem)
traits_type::move(_C_data+__pos+__n2, _C_data+__pos+__n, __rem);
for (__d = 0; __d < (size_type)__n2; __d++)
traits_type::assign (*(_C_data+__pos+__d), *__first2++);
traits_type::assign (_C_data[_C_pref()->_C_size = __len],
value_type());
}
}
return *this;
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
copy (pointer __s, size_type __n, size_type __pos) const
{
_RWSTD_REQUIRES (__pos <= size(),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("basic_string::copy(pointer, size_type, "
"size_type)"), __pos, size ()));
size_type __slen = size() - __pos;
size_type __rlen = __n < __slen ? __n : __slen;
traits_type::copy(__s, _C_data+__pos, __rlen);
return __rlen;
}
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
find (const_pointer __s, size_type __pos, size_type __n) const
{
_RWSTD_ASSERT(__s != 0);
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("basic_string::find(const_pointer, "
"size_type, size_type) const"),
__n, max_size ()));
for (size_type xpos = __pos; (xpos + __n) <= size() ; xpos++)
{
if (!traits_type::compare(_C_data+xpos, __s, __n))
return xpos;
}
return npos;
}
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
rfind (const_pointer __s, size_type __pos, size_type __n) const
{
_RWSTD_ASSERT(__s != 0);
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("basic_string::rfind(const_pointer, "
"size_type, size_type) const"),
__n, max_size ()));
if (size() < __n)
return npos;
size_type __slen = size() -__n;
size_type xpos_start = __slen < __pos ? __slen : __pos;
for (size_type xpos = xpos_start+1; xpos != 0 ; xpos--)
{
if (!traits_type::compare(_C_data+xpos-1, __s, __n))
return xpos-1;
}
return npos;
}
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
find_first_of (const_pointer __s, size_type __pos, size_type __n) const
{
_RWSTD_ASSERT(__s != 0);
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("basic_string::find_first_of(const_pointer, "
"size_type, size_type) const"),
__n, max_size ()));
for (size_type xpos = __pos; xpos < size() ; xpos++)
{
for (size_type __i = 0; __i < __n ; __i++)
if (traits_type::eq(_C_data[xpos], __s[__i]))
return xpos;
}
return npos;
}
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
find_last_of (const_pointer __s, size_type __pos, size_type __n) const
{
_RWSTD_ASSERT(__s != 0);
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("basic_string::find_last_of(const_pointer, "
"size_type, size_type) const"),
__n, max_size ()));
if (size())
{
size_type __slen = size() -1;
size_type xpos_start = __pos < __slen ? __pos : __slen;
for (size_type xpos = xpos_start+1; xpos != 0 ; xpos--)
{
for(size_type __i = 0; __i < __n ; __i++)
if (traits_type::eq(_C_data[xpos-1], __s[__i]))
return xpos-1;
}
}
return npos;
}
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
find_first_not_of (const_pointer __s, size_type __pos, size_type __n) const
{
_RWSTD_ASSERT(__s != 0);
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("basic_string::find_first_not_of("
"const_pointer, size_type, size_type) const"),
__n, max_size ()));
for (size_type xpos = __pos; xpos < size() ; xpos++)
{
bool found = false;
for (size_type __i = 0; __i < __n ; __i++)
{
if (traits_type::eq(_C_data[xpos], __s[__i]))
{
found = true;
break;
}
}
if (!found)
return xpos;
}
return npos;
}
template <class _CharT, class _Traits, class _Allocator>
_TYPENAME basic_string<_CharT, _Traits, _Allocator>::size_type
basic_string<_CharT, _Traits, _Allocator>::
find_last_not_of(const_pointer __s, size_type __pos, size_type __n) const
{
_RWSTD_ASSERT(__s != 0);
_RWSTD_REQUIRES (__n <= max_size (),
(_RWSTD_ERROR_LENGTH_ERROR,
_RWSTD_FUNC ("basic_string::find_last_not_of("
"const_pointer, size_type, size_type) const"),
__n, max_size ()));
if (size())
{
size_type __slen = size() -1;
size_type xpos_start = __pos < __slen ? __pos : __slen;
for (size_type xpos = xpos_start+1; xpos != 0 ; xpos--)
{
bool found = false;
for (size_type __i = 0; __i < __n ; __i++)
{
if (traits_type::eq(_C_data[xpos-1], __s[__i]))
{
found = true;
break;
}
}
if (!found)
return xpos-1;
}
}
return npos;
}
template <class _CharT, class _Traits, class _Allocator>
basic_string<_CharT, _Traits, _Allocator>
basic_string<_CharT, _Traits, _Allocator>::
substr (size_type __pos, size_type __n) const
{
_RWSTD_REQUIRES (__pos <= size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("basic_string::substr(size_type, size_type) "
"const"), __pos, size ()));
size_type __slen = size() -__pos;
size_type __rlen = __n < __slen ? __n : __slen;
return basic_string (_C_data + __pos, __rlen);
}
template <class _CharT, class _Traits, class _Allocator>
int basic_string<_CharT, _Traits, _Allocator>::
compare (size_type __pos1, size_type __n1,
const basic_string& __str,
size_type __pos2, size_type __n2) const
{
_RWSTD_REQUIRES (__pos2 <= __str.size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("basic_string::compare(size_type, size_type,"
"const basic_string&, size_type, size_type) "
"const"), __pos2, __str.size ()));
// "reduce" __n2 if necessary, where
// "reduce" := Ensure __pos2+__n2 < __str.size() so we can call a function that
// doesn't check this same inequality.
if(__str.size() - __pos2 < __n2)
__n2 = __str.size() - __pos2;
// compare(size_type, size_type, char*, size_type) will both
// (i) check pos1 to make sure it's less than size() and
// (ii) "reduce" __n1 if necessary
return compare(__pos1, __n1, __str.c_str()+__pos2, __n2);
}
template <class _CharT, class _Traits, class _Allocator>
int basic_string<_CharT, _Traits, _Allocator>::
compare (size_type __pos, size_type __n1,
const_pointer __s, size_type __n2) const
{
_RWSTD_REQUIRES (__pos <= size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("basic_string::compare(size_type, size_type,"
" const const_pointer, size_type) const"),
__pos, size ()));
if(size() - __pos < __n1)
__n1 = size() - __pos;
size_type __rlen = __n1 < __n2 ? __n1 : __n2;
int __res = traits_type::compare(_C_data+__pos,__s, __rlen);
if (__res == 0)
__res = (__n1 < __n2) ? -1 : (__n1 != __n2);
return __res;
}
_RWSTD_NAMESPACE_END // std
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -