《C++练习》——MAP的使用

【主要摘录C++ Primer第十一章内容】

给定一个string,转换为另一个string。程序的输入是两个文件。第一个文件是一些规则,用来转换第二个文件中的文本。每条规则由两部分组成:一个可能出现在输入文件中的单词和一个用来替换它的短语。表达的含义是,每当第一个单词出现在输入中,我们就将他替换为对应的短语。

单词转换文件的内容如下所示:
brb be right back
k okey?
y why
r are
u you
pic picture
thk thanks!
18r later

希望转换的文本为:
where r u
y dont u send me a pic
k thk 18r

建立转换映射:

map<string, string> buildMap(ifstream &map_file)
{
    map<string, string> trans_map;//保存转换规则
    string key;//要转换的单词
    string value;//替换后的内容

    //将第一个单词存入KEY中,行中剩余的单词内容存入value
    while (map_file >> key && getline(map_file, value))
    {
        if (value.size() > 1)//检查是否有转换规则
        {
            trans_map[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);
    //如果单词在转换规则map中
    if (map_it != m.cend())
    {
        return map_it->second;//使用替换短语
    }
    else
    {
        return s;//否则返回原string
    }
}

单词转换程序:

void word_transform(ifstream &map_file, ifstream &input)
{
    auto trans_map = buildMap(map_file);//保存转换规则
    string text;                        //保存输入中的每一行
    while (getline(input, text))        //读取一行输入
    {
        istringstream stream(text);     //读取每个单词
        string word;                    //控制是否打印空格
        bool firstword = true;          
        while (stream >> word)
        {
            if (firstword)
            {
                firstword = false;
            }
            else
            {
                cout << " ";            //在单词间打印一个空格
            }
            //transform返回它的第一个参数或其转换后的形式
            cout << transform(word, trans_map);     //打印输出
        }

        cout << endl;

    }
}

头文件、主函数及输出结果:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <sstream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream file1("in.txt");
    ifstream file2("out.txt");
    word_transform(file1, file2);
    system("pause");
    return 0;
}

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值