STL迭代器失效问题

编辑:谯胜平      分类:程序与算法      标签:迭代器      发布时间:2021-07-05      浏览次数:431

总结:顺序存储的容器,删除迭代器时,后面的元素自动前移,迭代器仍然有效

          链式存储的容器,删除迭代器时,当前迭代器失效,erase方法可以返回下一个有效的迭代器或者在erase方法里面对迭代器++也可以;

#include<iostream>
#include<vector>
#include<map> 
#include<list>
using namespace std;

void visitVe(vector<int> &ve){
    for(vector<int>::iterator it = ve.begin(); it != ve.end(); it++){
        if(*it == 3){
            //删除迭代器的时候,元素自动前移,迭代器仍然有效 
            ve.erase(it);
        }
        cout << *it << " ";
    }
    cout << endl;
}

void visitLi(list<int> &li){
    for(list<int>::iterator it = li.begin(); it != li.end(); it++){
        if(*it == 3){
            //迭代器失效,erase方法返回下一个有效的迭代器 
            it = li.erase(it);
            //直接在erase方法里面对迭代器++也可以 
            //li.erase(it++);
        }
        cout << *it << " ";
    }
    cout << endl;
}

void visitMp(map<int, int> &mp){
    for(map<int, int>::iterator it = mp.begin(); it != mp.end(); it++){
        if(it -> first == 3){
            //迭代器失效,erase方法返回下一个有效的迭代器
            it = mp.erase(it);
            //直接在erase方法里面对迭代器++也可以 
            //mp.erase(it++);
        }
        cout << it -> second << " ";
    }
    cout << endl;
}


int main(){
    vector<int> ve;
    ve.push_back(1);
    ve.push_back(2);
    ve.push_back(3);
    ve.push_back(4);
    ve.push_back(5);
    ve.push_back(6);
    visitVe(ve);
    
    list<int> li;
    li.push_back(1);
    li.push_back(2);
    li.push_back(3);
    li.push_back(4);
    li.push_back(5);
    li.push_back(6);
    visitLi(li);
    
    map<int, int> mp;
    mp[1] = 1;
    mp[2] = 2;
    mp[3] = 3;
    mp[4] = 4;
    mp[5] = 5;
    mp[6] = 6;
    visitMp(mp);
    
    return 0;
} 



看不清?换一个