【C++】关于STL容器进行删除操作时使用的迭代器

在对容器进行移除操作时,删除后下标变化是一个特别要小心的问题,在此对普通迭代器和反向迭代器进行分析

iterator

iterator从头到尾进行遍历,进行删除操作之后会影响后续元素的下标发生变化,导致实际应用中出现bug(误删除/漏删除)

reverse_iterator

reverse_iterator是从尾到头进行遍历,顺序从最后一个元素到第一个元素时,迭代器并不会影响当前已经遍历过元素的下标,每一次删除都是从后向前,删除的元素是当前迭代范围上游的元素。

实际案例解析:

for(std::vector<int>::reverse_iterator ite = err_var.rbegin(); ite != err_var.rend(); ++ite){
    m_import_mobj->remove(this,m_import_mobj->cmobj(*ite));
}

假设vector中存在ABCD四个元素,需要删除下标0,1,3的元素。第一次删除下标0的元素之后数组变成了BCD。而此时B变成了下标为0的元素,导致程序误删除。
使用reverse_iterator之后,ite从右往左进行遍历。删除下标为3的元素之后,数组变为ABC。继续迭代指向下标为1,数组变为AB,最终正确的remove需要删除的元素。

总结

正向的迭代器适用于一般的遍历(无操作遍历需要使用const_iterator)或者单个删除的遍历,而reverse_iterator适用于连续多次删除的场景,确保操作的安全性和稳定性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值