C++ string::earse的时间复杂度

这里只看

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的字符怎么办?有待查证….

作者

xiaomaotou31

发布于

2021-11-13

更新于

2021-11-13

许可协议

评论