vector的erase()函数
在做LeetCode283的时候,遇到了erase()函数的一个陷阱,故本文主要介绍了C++的STL中vector中erase()函数的理解。
erase()函数的使用
首先我们知道,erase()函数一共有两种,一种是给定删除的位置,另一种是对区间内的元素进行删除操作,其原型如下:
iteratorerase(iterator position);
iteratorerase(iterator first, iterator last);
erase()函数能够将迭代器it指向位置的元素删除,但是删除后该迭代器指向哪里呢。需要注意,其实erase()函数是有返回值的。故有一种常见错误如下,该代码目的在于删掉vec中值为1的元素。
for (auto it = vec.begin(); it != vec.end(); it++) {
if (*it == 1)
vec.erase(it);
}
当vec.erase(it)后,it就变成了一个没有指向的指针(野指针),故会出现error。
在查阅文档之后,发现erase()对于其返回值的定义如下:迭代器指定在任何删除的元素之后剩余的第一个元素,如果不存在则指向向量结尾。故将上述代码修改如下:
for (auto it = vec.begin(); it != vec.end();) {
if (*it == 1)
it = vec.erase(it);
else
it++;
}
这样的代码能够连续删除数字1,同时也不会出现数组越界的错误。
erase()函数的时间复杂度
erase()的复杂度为其析构函数的复杂度和对后面数据移动的复杂度,故在vector中除了删除最后一个元素为O(1)外,其他都为O(n)。
参考博文:http://t.csdn.cn/exYXR、https://www.cnblogs.com/zhgyki/p/10567837.html