注册 登录
编程论坛 C++教室

list<struct> c.erase

sudong0913 发布于 2010-09-16 17:47, 820 次点击
#include<iostream>
#include<list>
#include<string>
using namespace std;
struct students
{
    string name;
    int num;
    string sex;
    int age;
};
////////////////////////////////////
void input(list<students> &s);
void del(list<students> &s);
void show(list<students> s);
////////////////////////////////////
void input(list<students> &s)
{
    int k=1;
    students temp;
    while (0!=k)
    {
        cout<<"姓名:";
        cin>>temp.name;
        cout<<"学号:";
        cin>>temp.num;
        cout<<"性别:";
        cin>>temp.sex;
        cout<<"年龄:";
        cin>>temp.age;
        s.push_back(temp);
        cout<<"继续(1) 结束(0)"<<endl;
        cin>>k;
    }

}
//------------------------------------------------------
void del(list<students> &s, const int age)
{
    list<students>::iterator i=s.begin();
    while (i!= s.end())
    {
        if(age==i->age)
        {
            s.erase(i);
        }
            ++i;
    }
}
//------------------------------------------------------------
void show(list<students> s)
{
    cout<<"姓名\t"<<"学号\t"<<"性别\t"<<"年龄\t"<<endl;
    list<students>::iterator it=s.begin();
    while (s.end()!=it)
    {
        cout<<it->name<<"\t"<<it->num<<"\t"<<it->sex<<"\t"<<it->age<<endl;
        ++it;

    }
}
/////////////////////////////////////////////////////////////
void main()
{
    list<students> data;
    input(data);
    system("cls");
    show(data);
    int a;
    cout<<"输入要删除的年龄"<<endl;
    cin>>a;
    del(data,a);//编译能通过,但到了这里程序崩溃了~~求高手指点~~~
    show(data);
}
6 回复
#2
寒风中的细雨2010-09-16 18:32
list<students>::iterator del(list<students> &s, const int age)
{
    list<students>::iterator i=s.begin();
    while (i != s.end())
    {
        if(age==i->age)
        {
            return i;
         }
           ++i;
    }
    return 0;
}

    list<students>:: iterator p = del(data,a);//编译能通过,但到了这里程序崩溃了~~求高手指点~~~
    data.erase( p );
#3
sudong09132010-09-16 18:51
回复 2楼 寒风中的细雨
为什么不能直接在函数中删除呢?
#4
x_wangyue2010-09-17 00:36
你的程序中的erase调用破坏了迭代器,迭代器失效了
#5
x_wangyue2010-09-17 00:46
回复 2楼 寒风中的细雨
请教一下假如存在不止一个年龄相同的元素,那你的这个程序不是只删除了第一个吗,返回了第一个年龄相同的迭代器
函数不就停止了吗,剩下的好像没删除嘛!
#6
sudong09132010-09-17 12:37
在函数外~~删除一个后~~程序会传一个新的引用到del函数中?

[ 本帖最后由 sudong0913 于 2010-9-17 12:40 编辑 ]
#7
寒风中的细雨2010-09-17 19:14
void del(list<students> &s, const int age)
{
    list<students>::iterator i=s.begin();
    while (i!= s.end())
    {
        if(age==i->age)
        {
            i = s.erase(i);
            --i;
        }
            ++i;
    }
}
1