c++迭代器失效问题

Segentation fault(core dumped)

  在Linux上写程序的时候,我们在调试的时候会出现如标题一样的提示,这说明你的程序访问了非法的内存,用了非法的指针(可能说的不太准确,但一定是你访问了不该访问的内存),其中一种常见的错误就是迭代器的失效问题:
  举个栗子
int arr[6] = {1, 2, 3, 2, 3, 4};
vector<int> v1(arr, arr+6);
for(auto it = v1.begin(); it != v1.end(); it++) {
	if(*it == 2) {
		v1.erase(it);
	}
}

乍一看这是理所当然的操作, 把vector中的2删掉,但不然,当第一个2被删的时候,迭代器已经指向了一个空内存,当执行it++的时候显然不是访问我们想要访问的内存,故出现了内存访问错误。

那么问题来了,正确的操作是怎么样的呢?
为了让大家理解,我们应该要知道vector的erase函数的返回值是所删除元素的下一个空间;
所以正确的代码为:

int arr[6] = {1, 2, 3, 2, 3, 4};

vector<int> v1(arr, arr+6);
auto it = v1.begin();
while(it != v1.end()) {
	if(*it == 2) {
         it = v1.erase(it);
	} else {
         it++;
	}
}

Enjoy coding1

更多技术博客https://vilin.club/


  1. Written by Vilin. Thanks for your reading. ↩︎

展开阅读全文
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值