利用map将“简写信件”转化为“原始信件”

        我们首先来看这样一个场景: 某人很懒, 写信的时候, 经常用简写的形式代替完整的形式, 比如:

9494--->Yes, it is!

asap--->as soon as possible

sb--->se bi

....

     

      现在, 要写一套程序, 将这些简单的直接还原为原始的完整形式。 其实, 思路是很自然的, 对简写信中的每一个单词进行判断, 如果需要转化, 则转化, 如果不需要转化, 则不用转化。 这个需不需要, 取决于当前单词是否在map中, 好吧, 我们来看看编程模型吧:


     步骤一: 建立固定的转换规格文档default.txt, 其内容如下:

9494 Yes, it is!
asap as soon as possible
sb se bi
r are
y you


      步骤二: 在simpleLetter.txt中写信, 假设内容为:

i think y r a sb
9494
please reply it asap


      步骤三:写代码来转化:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #pragma warning(disable : 4786)  
  2. #include <map>  
  3. #include <string>  
  4. #include <iostream>  
  5. #include <fstream>  
  6. #include <sstream>  
  7. using namespace std;  
  8.   
  9. typedef map<string, string> mapSS;  
  10. typedef map<string, string>::const_iterator mapSSIT;  
  11.   
  12. // 转换规则  
  13. mapSS createMap(ifstream &mapFile)  
  14. {  
  15.     mapSS mp;  
  16.     string key;  
  17.     string value;  
  18.   
  19.     while(mapFile >> key && getline(mapFile, value)) // 其实value不再是一整行了  
  20.     {  
  21.         if(value.size() < 1)  
  22.         {  
  23.             exit(1);  
  24.         }  
  25.           
  26.         mp[key] = value.substr(1); // 好好理解一下这句话  
  27.     }  
  28.   
  29.     return mp;  
  30. }  
  31.   
  32. // 转换单词  
  33. const string& change(const string &s, const mapSS &mp)  
  34. {  
  35.     mapSSIT it = mp.find(s);  
  36.     if(it == mp.end())  
  37.     {  
  38.         return s;  
  39.     }  
  40.   
  41.     return it->second;  
  42. }  
  43.   
  44. // 转换信件  
  45. int main()  
  46. {  
  47.     ifstream inMP("default.txt");  
  48.     ifstream inLetter("simpleLetter.txt");  
  49.     if(!inMP || !inLetter)  
  50.     {  
  51.         return 1;  
  52.     }  
  53.   
  54.     mapSS mp = createMap(inMP);  
  55.     string line;  
  56.     while(getline(inLetter, line))  
  57.     {  
  58.         stringstream isstr(line); // 我们又和stringstream见面了, 好亲切  
  59.         string word;  
  60.   
  61.         bool isFirstWord = true;  
  62.         while(isstr >> word)  
  63.         {  
  64.             if(isFirstWord)  
  65.             {  
  66.                 isFirstWord = false;  
  67.             }  
  68.             else  
  69.             {  
  70.                 cout << " ";  
  71.             }  
  72.             cout << change(word, mp);  
  73.         }  
  74.   
  75.         cout << endl;  
  76.     }  
  77.   
  78.     return 0;  
  79. }  
      程序的结果为:

i think you are a se bi
Yes, it is!
please reply it as soon as possible


      当然, 需要指出的是, 如果在简写信件里面有标点符号, 那么很可能对程序造成影响。 上面程序仅仅是考虑了一些简单的情况。


      再一次, 我们看到了map的强大用途。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值