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

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

iterator

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

reverse_iterator

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

实际案例解析:

for(std::vector::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适用于连续多次删除的场景,确保操作的安全性和稳定性

你可能感兴趣的:(C++杂项知识记录,c++,开发语言)