list程序详解
#include<iostream>
#include<list>
#include<string>
using namespace std;
class Student{
string m_strNO;
string m_strName;
string m_strUniversity;
int m_nTotal; //总分
public:
Student(string strNO,string strName,string strUniversity,int Total):
m_strNO(strNO),m_strName(strName),m_strUniversity(strUniversity),m_nTotal(Total)
{
}
bool operator<(Student& s)
{
return m_strNO<s.m_strNO;
}
bool operator==(Student& s) {
return m_strNO==s.m_strNO;
}
string GetNO() { return m_strNO; }
string GetName() { return m_strName; }
string GetUniversity() { return m_strUniversity; }
int GetTotal() { return m_nTotal; }
};
ostream& operator<<(ostream& os,Student& s) //重载运算符的实现
{
os<<s.GetNO()<<"\t"<<s.GetName()<<"\t"<<s.GetUniversity()<<"\t"<<s.GetTotal();
return os;
}
typedef list<Student> LISTSTUD;
class stuManage {
LISTSTUD m_stlList; //定义list<Student>类型的数据 list是一个双向链表
public: bool Add(const Student &s) {
m_stlList.push_back(s); //将s加入list中
return true;
}
bool Merge(stuManage& std) {
m_stlList.sort();
std.m_stlList.sort(); //m_stlList是stuManage的数据元素, //只不过m_stlList这个数据元素是一个list类型的类
m_stlList.merge(std.m_stlList); //合并两个list类型
m_stlList.unique(); //容器内相邻元素若有重复的,则仅保留一个
return true;
}
void Show() {
for(LISTSTUD::iterator it=m_stlList.begin();it!=m_stlList.end();it++)
{ cout<<*it<<endl; }
}
};
void main() {
stuManage sm1; //每一个stuManage类中都有一个list链表
stuManage sm2;
Student s1("1001","zhangsan","tsinghua",670);
Student s2("1002","lisi","beida",660);
Student s3("1003","wangwu","fudan",650);
Student s4("1004","zhaoliu","nankai",640);
Student s5("1005","zhouqi","tongji",630);
sm1.Add(s1);
sm1.Add(s2);
sm1.Add(s5);
sm2.Add(s5);
sm2.Add(s4);
sm2.Add(s3);
sm2.Add(s1);
sm1.Merge(sm2);
sm1.Show();
}
该程序有一个基本类Student,一个集合维护类StuManage,
StuManage类Merge成员函数封装了两个list容器的排序,合并及去掉重复元素的功能
注
由于对list容器均是按学号进行排序、合并的,因此要重载基本类Student中的operator<操作符。又由于要按学号是否相同去掉重复记录,因此必须重载基本类Student中的operaror==操作符。
浙公网安备 33010602011771号