C++vector中erase的思考

本文介绍了C++STL中vector的erase()函数,包括其两种用法、返回值的处理以及可能遇到的陷阱。特别强调了在使用过程中迭代器的变化及函数的时间复杂度分析。
摘要由CSDN通过智能技术生成

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/exYXRhttps://www.cnblogs.com/zhgyki/p/10567837.html

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值