C++ Primer 第5版--练习11.33

练习 11.33:实现你自己版本的单词转换程序。

练习 11.34:如果你将transform函数中的find替换为下标运算符,会发生什么情况?

练习 11.35:在buildMap中,如果进行如下改写,会有什么效果?

         trans_map[key] = value.substr(1);

 改为trans_map.insert({key, value.substr(1)})

#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <stdexcept>

using namespace std;

map<string, string> buildMap(ifstream &map_file)
{
    map<string, string> trans_map;
    string key, value;
    while(map_file >> key && getline(map_file, value))
        if (value.size() > 1)
            trans_map[key] = value.substr(1);
            //trans_map.insert({key, value.substr(1)});  //与上条语句等价
        else
            throw runtime_error("no rule for " + key);
        return trans_map;
}

const string &transform(const string &s, const map<string, string> &m)
{
    auto map_it = m.find(s);
    if (map_it != m.end())
        return map_it->second;
    else
        return s;
}
/*
//transform函数中的find替换为下标运算符
const string &transform(string &s, map<string, string> &m)
{
    if (m[s].size())
        s = m[s];
    return s;
}
*/

void word_transform(ifstream &map_file, ifstream &input_file)
{
    auto trans_map = buildMap(map_file);
    string text;
    while(getline(input_file, text))
    {
        istringstream stream(text);
        string word;
        bool firstword = true;
        while(stream >> word)
        {
            if (firstword)
                firstword = false;
            else
                cout << " ";
            cout << transform(word, trans_map);
        }
        cout << endl;
    }
}

int main()
{
    ifstream map_file("map.txt"), input_file("input.txt");
    word_transform(map_file, input_file);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值