在对容器进行移除操作时,删除后下标变化是一个特别要小心的问题,在此对普通迭代器和反向迭代器进行分析
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适用于连续多次删除的场景,确保操作的安全性和稳定性