习题10.18
定义一个map对象,其元素的键是家族姓氏,值是存储该家族孩子名字的vector对象。为这个map插入至少6个条目。通过基于家族姓氏的查询检查你的程序,查询应输出该家族所有孩子的名字。
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <utility>
using namespace std;
typedef vector<string> vstring;
int main()
{
map<string,vstring> family;
string fname,cname,index;
//用do while可以保证程序能正确分别输入的fname和cname
do{
cout<<"家庭姓氏:";
cin>>fname;
//chilren用来存储孩子的姓名,ret返回查询map中键为fname的值是否存在,如果存在就返回fname的迭代器,如果不存在返回family.end()
vector<string> chilren;
//这里开始用pair<map<string,vstring>,bool> ret = family.insert(make_pair(fname,chilren)); 但是错了,还没搞明白原因
map<string,vstring>::iterator ret = family.find(fname);
<span style="white-space:pre"> </span>if(ret != family.end()){
//此处可扩展为如果fname存在则让玩家选择是否在该家庭内新增孩子
cout<<"姓氏已存在!是否继续(Y/N):";
cin>>index;
if(index == "Y" || index == "y"){
continue;
cin.clear();
}else
break;
}else{
cout<<"输入孩子姓名(Quit退出):";
while(cin>>cname ){
if(cname != "Quit"){
cout<<"输入孩子姓名(Quit退出):";
chilren.push_back(cname);
}else
break;
}
family.insert(make_pair(fname,chilren));
cin.clear();
cout<<"是否继续(Y/N):";
cin>>index;
if(index == "Y" || index == "y"){
continue;
cin.clear();
}else
break;
}
}while(cin);
cin.clear();
//查询
cout<<"请输入要查询的家庭姓氏:";
cin>>fname;
map<string,vstring>::iterator ret = family.find(fname);
if(ret != family.end()){
cout<<"要查询的孩子为:";
vector<string>::iterator ite=ret->second.begin();
while(ite != ret->second.end())
cout<<*ite++<<" ";
}else
cout<<"没有您要查询的家庭!"<<endl;
system("pause");
}
10.19
对10.18做了拓展,使其vector存储一个pair对象来放孩子的姓名和生日
typedef vector< pair<string,string> > vstring;
int main()
{
map<string,vstring> family;
string fname,cname,index,birth;
do{
cout<<"家庭姓氏:";
cin>>fname;
vector< pair<string,string> > chilren;
map<string,vstring>::iterator ret = family.find(fname);
if(ret != family.end()){
cout<<"姓氏已存在!是否继续(Y/N):";
cin>>index;
if(index == "Y" || index == "y"){
continue;
cin.clear();
}else
break;
}else{
cout<<"输入孩子姓名和生日(ctrl+z退出):";
while(cin>>cname>>birth ){
cout<<"输入孩子姓名和生日:";
chilren.push_back(make_pair(cname,birth));
}
//make_pair用的是()而不是<>.....
family.insert(make_pair(fname,chilren));
cin.clear();
cout<<"是否继续(Y/N):";
cin>>index;
if(index == "Y" || index == "y"){
continue;
cin.clear();
}else
break;
}
}while(cin);
cin.clear();
//查询
cout<<"请输入要查询的家庭姓氏:";
cin>>fname;
map<string,vstring>::iterator ret = family.find(fname);
if(ret != family.end()){
cout<<"要查询的孩子为:";
vector< pair<string,string> >::iterator ite=ret->second.begin();
while(ite != ret->second.end()){
cout<<(ite->first)<<" "<<(ite->second)<<endl;
ite++;
}
}else
cout<<"没有您要查询的家庭!"<<endl;