list处理文件内容合并并去重,排序输出

问题:两个文本文件包含某中学的高考成绩,其中包含学生的准考证号、姓名、大学和总成绩。但两文件内内容有重复,现要求把两文本文件内容合并,去掉重复记录,并按准考证号升序排列输出。

#include <iostream>
#include <list>
#include <string>
#include <fstream>
#include <functional>
#include <algorithm>
#include <iterator>
#include <sstream>

using namespace std;

class Student
{
public:
    Student(const string &id, const string &name, const string &university, const int &grade):
        m_id(id), m_name(name), m_university(university), m_grade(grade){}

    bool operator<(const Student &st)
    {
        return m_id < st.m_id;
    }
    bool operator==(const Student &st)
    {
        return m_id == st.m_id;
    }
    const string &GetId() const{return m_id;}
    const string &GetName() const{return m_name;}
    const string &GetUniversity() const{return m_university;}
    const int &GetGrade() const{return m_grade;}

private:
    string m_id;
    string m_name;
    string m_university;
    int m_grade;
};
ostream &operator<<(ostream &os, const Student &st)
{
    os << st.GetId() << "\t\t" << st.GetName() << "\t\t" << st.GetUniversity() << "\t\t" << st.GetGrade() <<endl;
    return os;
}

class StudentMS
{
public:
    bool AddStudent(const Student &st)
    {
        m_ls.push_back(st);
        return true;
    }
    bool Merge(StudentMS &stms)
    {
        m_ls.sort();
        stms.m_ls.sort();
        m_ls.merge(stms.m_ls);
        m_ls.unique();
        return true;
    }
    void ShowStudent()
    {
        copy(m_ls.begin(), m_ls.end(), ostream_iterator<Student>(cout, ""));
    }

private:
    list<Student> m_ls;
};

void dealText(const string &path, StudentMS &stms)
{
    ifstream is(path, ios::in);
    if(!is) exit(1);
    string str1, str2, str3, str4;
    int sgrade;

    while(!is.eof())
    {
        is >> str1 >> str2 >> str3 >> str4;
        istringstream ist(str4);
        ist >> sgrade;
        Student st(str1, str2, str3, sgrade);
        stms.AddStudent(st);
    }
    is.close();
}

int main()
{
    StudentMS stms1;
    StudentMS stms2;
    dealText("F:/C++/C++FX_STL/STL/list1.txt", stms1);
    dealText("F:/C++/C++FX_STL/STL/list2.txt", stms2);
    stms1.Merge(stms2);
    stms1.ShowStudent();

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值