这里只看
1
| string& erase (size_t pos = 0, size_t len = npos);
|
这个重载的代码
源代码
直接看这个earse的源代码
1 2 3 4 5 6 7 8 9 10 11
| basic_string& erase(size_type __pos = 0, size_type __n = npos) { _M_check(__pos, "basic_string::erase"); if (__n == npos) this->_M_set_length(__pos); else if (__n != 0) this->_M_erase(__pos, _M_limit(__pos, __n)); return *this; }
|
这部分代码调用了_M_erase
1 2 3 4 5 6 7 8 9 10 11 12
| template<typename _CharT, typename _Traits, typename _Alloc> void basic_string<_CharT, _Traits, _Alloc>:: _M_erase(size_type __pos, size_type __n) { const size_type __how_much = length() - __pos - __n;
if (__how_much && __n) this->_S_move(_M_data() + __pos, _M_data() + __pos + __n, __how_much);
_M_set_length(length() - __n); }
|
可以看到,这里又调用了_S_move,输入的参数分别是要删除位置的指针和删除子串之后的指针。这里其实就是将后面的未删除的部分移动到删除的位置。
1 2 3 4 5 6 7 8
| static void _S_move(_CharT* __d, const _CharT* __s, size_type __n) { if (__n == 1) traits_type::assign(*__d, *__s); else traits_type::move(__d, __s, __n); }
|
可以看到这里用了move,将s指针的字符串移动到d指针的位置,移动的大小是n。时间复杂度为$O(N)$
不过我不是很能理解,将s位置的n个字符移动到d之后,那么s+n的字符怎么办?有待查证….