容器中使用erase的正确姿势(List Iterator Not Incrementable)

使用容器中的erase遇到"List Iterator Not Incrementable"问题,正确食用erase的姿势,以list为例

举个例子:

1.

list<int> sList;
list<int>::iterator sP;

sList.push_back(1);
sList.push_back(3);
sList.push_back(5);
sList.push_back(7);

for (sP = sList.begin();sP!=sList.end();sP++)

{

  if(*sP == 3)

    sP = sList.erase(sP); //清除后,自动指向下一个结点

}

如果恰好不是在3不是在sList的结尾,这个没有什么问题;

关键是,如果是在结尾,请看:

2.

list<int> sList;
list<int>::iterator sP;

sList.push_back(3);

for (sP = sList.begin();sP!=sList.end();sP++)

{

  if(*sP == 3)

    sP = sList.erase(sP);  //sP得值为负值

}

这样因为最后会再次执行一次循环,操作sP++,这时就会报错,因为此时sP已经无指向;

预防这种错误,如网上说的:

在执行sP = sList.erase(sP);  //sP得值为负值

后面加入 sP--;更会出错;

 

最后的解决办法:

sList.push_back(3);

for (sP = sList.begin();sP!=sList.end();)
 {
  if (*sP == 3)
  {
   sP = sList.erase(sP); //sP指向下一个,如果sP当前指向为end的前一个,那执行完后,指向end
  }
  else
  {
   sP++;  //如果上面没有执行,sP指向下一个
  }
 }

再测试,就没有问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值