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

来源:互联网 发布:qpst怎么添加端口 编辑:程序博客网 时间:2024/06/16 21:57

【主要摘录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 0