容器中使用erase的正确姿势(List Iterator Not Incrementable)
2015-06-01 11:12
447 查看
使用容器中的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指向下一个
}
}
再测试,就没有问题了。
举个例子:
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指向下一个
}
}
再测试,就没有问题了。
相关文章推荐
- vim_快捷键操作_动作
- s:iterator数据累加示例代码
- Web服务Https配置和代码访问方法
- Linux iptables详解
- IE8 透明度兼容性
- GRE数学备考小贴士
- JS实现屏蔽shift,Ctrl,alt等功能键的方法
- 6个值得推荐的Android开源框架简介
- iOS - OC - ARC中使用MRC(非ARC)文件(草稿)
- 炒股,你必须弄明白这9个问题
- 【随想_0】关于本博客
- 每天一个linux命令(50):crontab命令
- SAT填空题四类逻辑结构总结
- RRDTool工具使用详解
- aapt的常用命令
- 对象与xml之间的转换_XmlElement
- 冒泡排序
- Symmetric Tree
- OC运行时编程指南
- 【JAVA】使用ZXing生成二维码