essential c++ 練習題(2)

早上起來寫了課後習題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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章