c++利用STL编写简易通讯录

来源:互联网 发布:销售网络建设与管理 编辑:程序博客网 时间:2024/06/07 16:25
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
//结构体
struct Msg
{
//构造函数
Msg();
Msg(int,const char*,const char*);
int id;
string name;
string tel;
};
Msg::Msg()
{
}
Msg::Msg(int i,const char* n,const char* t):id(i),name(n),tel(t)
{
}
bool operator==(Msg& m,Msg& g)
{
if(m.id==g.id && 0==m.name.compare(g.name) && 0==m.tel.compare(g.tel))
return true;
else
return false;
}


ostream& operator<<(ostream& output,Msg& g)
{
output<<g.id<<'\t';
output<<g.name<<'\t';
output<<g.tel<<'\t';
}
//初始化-(A-Z)
void InitRecord(map< char,vector<Msg> > & rec)//初始化
{
rec['@']=vector<Msg>();//不能识别的
char ch='A';
for(;ch<='Z';ch++)
{
rec[ch]=vector<Msg>();//rec[key]=value;
}
}


//打印 首字母
void show(map<char,vector<Msg> >&rec)//显示所有人数据
{
map<char,vector<Msg> >::iterator the;


vector<Msg>::iterator va_the;


for(the=rec.begin();the!=rec.end();the++)//迭代器指向是元素(key_value)
{
va_the=the->second.begin();
if(the->second.size()>0)
{
cout<<the->first<<endl;
for(;va_the!=the->second.end();va_the++)
{
cout<<"   "<<"ID:"<<va_the->id<<'\t'\
        <<"姓名: "<<va_the->name<<'\t'\
  <<"电话: "<<va_the->tel<<'\t'\
  <<endl;
}
}
}
}


char charge(char ch)
{
if(ch>='A' && ch<='Z')
return ch;
else
return ch-32;
}
bool AddMember(map< char,vector<Msg> >& rec,struct Msg data)//增加成员
{
//查找
map< char,vector<Msg> >::iterator the;
the=rec.find( charge(data.name.at(0)) );
if(the==rec.end())
the=rec.begin();
//插入元素
the->second.push_back(data);
return true;
}
bool DelMember(map< char,vector<Msg> >& rec,struct Msg data)//删除指定人的数据
{
map< char,vector<Msg> >::iterator the;
the=rec.find( charge(data.name.at(0) ));


if(the==rec.end())
{
the=rec.begin();
}

vector<Msg>::iterator va_the;


va_the=the->second.begin();


for(;va_the!=the->second.end();va_the++)
{
if(*va_the==data)
{
the->second.erase(va_the);
cout<<"删除成功"<<endl;
return true;
}
}
return false;
}
bool FindMember(map< char,vector<Msg> >& rec,string name)//查找指定人的数据
{
map< char,vector<Msg> >::iterator the;
the=rec.find( charge(name.at(0)));

vector<Msg>::iterator va_the;


va_the=the->second.begin();


int i=0;


for(;va_the!=the->second.end();va_the++)
{
if(0==(*va_the).name.compare(name))
{
cout<<"查询结果:"<<endl<<"ID:"<<(*va_the).id<<'\t'<<"姓名:"<<(*va_the).name<<'\t'<<"电话:"<<(*va_the).tel<<endl;
i++;
}
}
if(0==i)
{
cout<<"查无此人!"<<endl;
return false;
}
else
return true;


}


bool FindFname(map< char,vector<Msg> >& rec,char C)//查找名字首字母相同的人的数据
{
map< char,vector<Msg> >::iterator the;


the=rec.find(charge(C));


if(the==rec.end())
{
cout<<"No"<<endl;
return false;
}
vector<Msg>::iterator va_the;


va_the=the->second.begin();


for(;va_the!=the->second.end();va_the++)
{
cout<<*va_the<<endl;
}
return true;
}


bool ModifyMember(map< char,vector<Msg> >& rec,string name)//修改指定人的数据
{
map< char,vector<Msg> >::iterator the;
the=rec.find( charge(name.at(0)));

vector<Msg>::iterator va_the;


va_the=the->second.begin();


int newid=0;
string newname;
string newtel;


for(;va_the!=the->second.end();va_the++)
{
if(0==(*va_the).name.compare(name))
{
cout<<"请输入新名称:";
cin>>newname;
cout<<"请输入新ID:";
cin>>newid;
cout<<"请输入新号码:";
cin>>newtel;


(*va_the).id=newid;
(*va_the).name=newname;
(*va_the).tel=newtel;
return true;
}
}
return false;
}
int main()
{
//键值对
map< char,vector<Msg> > record;
//初始化
InitRecord(record);

AddMember(record,Msg(170201,"#123","1234567"));
AddMember(record,Msg(170201,"&123","1234567"));
AddMember(record,Msg(170202,"lixin","1234567"));
AddMember(record,Msg(170203,"xiaoxin","1234567"));
AddMember(record,Msg(170204,"lijiajun","1234567"));
AddMember(record,Msg(170205,"caijiahao","1234567"));
AddMember(record,Msg(170206,"aidi","1234567"));
AddMember(record,Msg(170207,"clearlove","1234567"));
AddMember(record,Msg(170208,"faker","1234567"));
AddMember(record,Msg(170209,"zhansan","1234567"));
AddMember(record,Msg(1702010,"zhansanfeng","1234567"));
//遍历
cout<<"删除前:"<<endl;
show(record);


cout<<endl<<endl<<"删除后:"<<endl;
DelMember(record,Msg(170204,"lijiajun","1234567"));
show(record);


FindMember(record,"asd");


FindFname(record,'G');


ModifyMember(record,"lixin");
show(record);
return 0;
}