单词转换就是:将一些缩写的单词转换为实际的文本。第一个文件保存的是转换的规则,而第二个文件保存的是要转换的文本。

假设单词转换的规则的文件如下:

brb be right back
k okay?
y why
r are
u you
pic picture
thk thanks!
l8r later

我们希望转换的文本为:

where r u
y dont you send me a picture
okay? thanks! later

则程序应该生成这样的输出:

where  are  you
why dont you send me a picture
okay? thanks! later

我们先定义word_transform函数,最重要的部分是调用buildMap和transform函数:

void word_transform(std::ifstream& map_file, std::ifstream& input) {

	auto trans_map = buildMap(map_file);

	std::string text;
while (getline(input, text)) { std::istringstream stream(text); std::string word; bool firstword = true;
while (stream >> word) { if (firstword)
firstword = false;
else
std::cout << " "; std::cout << transform(word, trans_map);
}
std::cout << std::endl; } }

函数buildMap读入给定文件,建立起转换映射:

std::map<std::string, std::string> buildMap(std::ifstream& map_file) {

	std::map<std::string, std::string> trans_map; 

	std::string key;   // 要转换的单词
std::string value; // 替换后的内容 while (map_file >> key && getline(map_file, value)) { if (value.size() > 1)
trans_map[key] = value;
else
throw std::runtime_error("no rule for" + key);
} return trans_map;
}

而transform函数则将给定的字符串转换为对应文本:

const std::string& transform(const std::string& s, const std::map<std::string, std::string>& m) {

	auto map_it = m.find(s);

	if (map_it != m.cend())
return map_it->second;
else
return s;
}

我们主程序里调用:

int main(int argc, char* argv[])
{ // words transform std::ifstream transRuleFile("transRule.txt");
std::ifstream wordsNdTransFile("wordsNeedTrans.txt"); word_transform(transRuleFile, wordsNdTransFile); return 0;
}

输出为:

C++ Primer : 第十一章 : 关联容器示例: 一个单词转换的map的更多相关文章

  1. C++ Primer : 第十一章 : 关联容器之概述、有序关联容器关键字要求和pair类型

    标准库定义了两种主要的关联容器:map和set map中的元素时一些关键字-值(key-value)对,关键字起到索引的作用,值则表示与索引相关的数据.set中每个元素只包含一个关键字,可以完成高效的 ...

  2. C++ Primer : 第十一章 : 关联容器之关联容器的迭代器和操作

    关联容器的操作 除了和顺序容器定义的类型之外,关联容器还定义了一下几种类型: 关联容器额外的类型别名  key_type    此容器类型的关键字类型 mapped_type  每个关键字关联的类型, ...

  3. [C++ Primer] : 第11章: 关联容器

    目录 使用关联容器 关联容器概述 关联容器操作 无序容器 使用关联容器 关联容器与顺序容器有着根本的不同: 关联容器中的元素是按关键字来保存和访问的, 按顺序容器中的元素是按它们在容器中的位置来顺序保 ...

  4. 《C++ Primer》笔记 第11章 关联容器

    关联容器类型 解释 按关键字有序保存元素 -- map 关联数组:保存关键字-值对 set 关键字即值,即只保存关键字的容器 multimap 关键字可重复出现的map multiset 关键字可重复 ...

  5. 【c++ Prime 学习笔记】第11章 关联容器

    关联容器的元素按照关键字来保存和访问,而顺序容器的元素是按照在容器中的位置来保存和访问 关联容器支持高效的关键字查找和访问 2种关联容器: map中的元素是关键字-值对(key-value对),关键字 ...

  6. 【足迹C++primer】38、关联容器操作(2)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/35244805 关联容器操作(2) map ...

  7. C++ Primer 读书笔记:第10章 关联容器

    第10章 关联容器 引: map set multimap multiset 1.pair类型 pair<string, int> anon anon.first, anon.second ...

  8. C++Primer 第十一章

    //1.关键容器支持高效的关键字查找和访问. map 关联数组:保存关键字-值对.通过关键字来查找值. set 关键字即值,即只保存关键字的容器. multimap 关键字可重复出现的map mult ...

  9. C++ Primer 5th 第11章 关联容器

    练习11.1:描述map 和 vector 的不同. map是关联容器,vector是顺序容器,关联容器与值无关,vector则与值密切相关 练习11.2:分别给出最适合使用 list.vector. ...

随机推荐

  1. 使用ASP.Net WebAPI构建REST服务(三)——返回值

    Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...

  2. WebBrowers & HtmlViewers collection

    WebBrowers & HtmlViewers collection 浏览: 加入我的收藏 楼主: THtmlViewerhttps://github.com/BerndGabriel/Ht ...

  3. IT公司100题-11-求二叉树中节点的最大距离

    问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根 ...

  4. android button text属性中英文大小写问题

    Android版本升级的原因,需要手动添加属性android:textAllCaps="false"

  5. [转]change the linux startup logo

    1. Make sure that you have the kernel sources installed. As annoying as this may seem, you will need ...

  6. android平台手电筒开发源代码

    android平台手电筒开发源代码,AndroidManifest.xml文件的入口是startapp,这个文件没上传上来,大家可以自己写. 1. [代码]android 1 2 3 4 5 6 7 ...

  7. JVM-运行时数据区

                                                                              运行时数据区示意图                 ...

  8. hdu2795 线段树

    //Accepted 6396 KB 3046 ms //线段树 //由于n只有200000,我们可以知道,当h>200000时,大于200000的部分是没有用的 //所以我们可以用n来创建线段 ...

  9. mysql innoDB 与 myISAM

    转载文章 出处  http://www.pureweber.com/article/myisam-vs-innodb/ 使用MySQL当然会接触到MySQL的存储引擎,在新建数据库和新建数据表的时候都 ...

  10. python实现简单随机模拟——抛呀抛硬币

    还是在上次提到的数据之魅那本书,看到模拟这章,有个python模拟脚本,但书上不全,就自己简单写了下. 流程:在不同的平衡参数p(为0.5时为均匀的)下,模拟60次实验,每次投硬币8次,统计正面朝上的 ...