【C++ Primer备忘录】习题10.18

习题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;	



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值