早上起來寫了課後習題3.3,進一步熟悉瞭解map、vector等容器的一些用法。在這道題中需要注意的是,因爲題目的需要,將map的value設置爲vector < string >。代碼部分都有詳細註釋,應該能看懂~
/*
@author NvRom
2016.5.15 in USTC
*/
#include <map>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
typedef std::vector<std::string> vString;
//文件每一行第一個爲姓氏名,後面爲孩子名
int main(){
std::map<std::string , vString> familyMap;
std::string familyStr;
//打開輸入輸出文件
std::ifstream inFile("family.txt");
std::ofstream outFile("outFamily.txt");
if (!inFile || !outFile){
std::cout<<"無法打開目標文件,請檢查文件是否存在"<<std::endl;
}
//處理每一行的family name以及children name,這些都包含在familyStr中
//利用substr(firstPos , length)來劃分新字符串
while(getline(inFile , familyStr)){
//
std::string familyName;
std::string childrenName;
std::vector<std::string>children;
//pos:當前的' '的位置
//prevPos:' '前一個單詞首字母所在位置
std::string::size_type pos = 0 , prevPos = 0;
//find_first_of:從pos開始找特定字符或字符串,返回其地址;若沒找到返回string::npos
while ((pos = familyStr.find_first_of(' ' , pos)) != std::string::npos){
std::string::size_type length = pos - prevPos;
//prevPos沒有被重新賦值時,表示讀到的是第一個單詞
if (!prevPos){
familyName = familyStr.substr(prevPos , length);
outFile<<"family name:"<< familyName<<"\t"<<"childred name:"<<"\t";
prevPos = ++ pos;
}else{
childrenName = familyStr.substr(prevPos , length);
children.push_back(childrenName);
outFile<<childrenName<<"; ";
prevPos = ++ pos;
}
}
//處理最後一個單詞,此時pos爲string::npos
//當這一行只有一個單詞時,表示其沒有後代
if (prevPos < familyStr.size()){
if (prevPos)
{
childrenName = familyStr.substr(prevPos , pos - prevPos);
children.push_back(childrenName);
outFile<<childrenName<<"; ";
}else
{
familyName = familyStr.substr(prevPos , pos - prevPos);
outFile<<"family name:"<< familyName;
}
}
outFile<<"\n";
/*
寫入map中,當familyMap[familyName] = children不存在familName時,
往map中自動添加key值,然後再添加value值
*/
if (familyMap.count(familyName)){
std::cout<<"已經存在family name"<<familyName<<std::endl;
}else
{
familyMap[familyName] = children;
}
}
outFile<<std::endl;
//查詢map中key值
std::string sqlStr;
while (std::cin>>sqlStr){
if (sqlStr == "q" || sqlStr == "Q"){
break;
}
//利用map中find函數查找
std::map<std::string , vString>::iterator mit = familyMap.find(sqlStr);
if (mit != familyMap.end()){
std::cout<<"family name 爲:"<<sqlStr<<",他共有"<<mit->second.size()<<"個孩子,分別爲:\t";
std::vector<std::string>::iterator ivec = mit->second.begin();
for (;ivec < mit->second.end();ivec ++){
std::cout<<*ivec<<" ";
}
}else{
std::cout<<"找不到該family name";
}
std::cout<<std::endl;
}
return 0;
}