C++ 标准模板库实现list循环删除操作

来源:互联网 发布:婚纱照相册制作软件 编辑:程序博客网 时间:2024/05/16 10:41

在用iterator遍历整个list时,iterator相当于链表中的当前结点指针,如果我们在循环体中遍历整个list, 并且对满足一定条件的元素进行删除操作,一定要先保存当前要删除结点的下一个结点的iterator,否则删除完元素的下一次循环体会因为指针丢失而报错。

#include<iostream>

#include<string>
#include<list>
#include<algorithm>

using namespace std;

class student
{
public:
int id;
string name;
student(int m,string n):id(m),name(n){}
};

void show(const student & stu)
{
cout<<"id= "<<stu.id<<"   name= "<<stu.name<<endl;
}

int main()
{
student s1(1,"lisi");
student s2(2,"zhangsan");
student s3(3,"wangwu");
student s4(4,"lisi");
student s5(5,"lisi");

list<student> st;
st.push_back(s1);
st.push_back(s2);
st.push_back(s3);
st.push_back(s4);
st.push_back(s5);

for_each(st.begin(),st.end(),show); 
cout<<endl;

list<student>::iterator lta;
list<student>::iterator ltc;
for(lta=st.begin();lta!=st.end();)
{   
if(lta->name == "lisi")
{
if(lta==st.begin())//如果要删除的结点为头结点,先保存lta,再删除,避免指针悬空
{
ltc=lta;
lta++;
st.erase(ltc);
continue ;
}

ltc=lta;      //如果要删除的结点为其它结点,先保存lta,再删除,避免指针悬空
--lta;        //防止越界
st.erase(ltc);

}

lta++;
}

for(list<student>::iterator ltb=st.begin();ltb!=st.end();ltb++)
{
cout<<"id= "<<ltb->id<<"   name= "<<ltb->name<<endl;

}

       //for_each(st.begin(),st.end(),show); 

cin.get();
return 0;

}


也可以通过计数的方式循环删除相同的数据

int main4()
{
student s1(1,"lisi");
student s2(2,"zhangsan");
student s3(3,"wangwu");
student s4(4,"lisi");
student s5(5,"lisi");

int i=0,n=0;

list<student> st;
st.push_back(s1);
st.push_back(s2);
st.push_back(s3);
st.push_back(s4);
st.push_back(s5);

for(list<student>::iterator lt=st.begin();lt!=st.end();lt++)
{
n++;
cout<<"id= "<<lt->id<<"   name= "<<lt->name<<endl;
}

while(i<n)
{
list<student>::iterator lta;
for(lta=st.begin();lta!=st.end();++lta)
{   
if(lta->name == "lisi")
{
st.erase(lta);
break;
}
}
i++;
}

for(list<student>::iterator ltb=st.begin();ltb!=st.end();ltb++)
{
cout<<"id= "<<ltb->id<<"   name= "<<ltb->name<<endl;
}
 

cin.get();
return 0;
}

原创粉丝点击