原创 "单词转换"map对象

2011-3-5 10:10 2093 2 3 分类: 软件与OS

此程序说明如何创建,查找和迭代遍历一个map对象.

问题:给出一个string对象,把它转换成另一个string对象.本程序的输入是两个文件.第一个文件包括若干对单词,每对的第一个单词将出现在输入的字符串中,而第二个单词用于输出.本质上,这个文件提供的是单词转换的集合,在遇到第一个单词时,应该用之替换为第二个单词.第二个文件则提供了需要转换的文本.

若单词转换文件的内容是:

'em    them

cuz    because

qratz   grateful

i       I

nah    no

pos  supposed

sez  said

tanx   thanks

wuz   was

需要转换的文本是:

nah i sez tanx cuz i wuz pos to not cuz i wuz gratez

解决方案:

将单词转换文件的内容存储在一个map容器中,将被替换的单词作文键,而用作替换的单词则作为其相应的值.接着读取输入,查找输入的每个单词是否对应有转换.若有,则实现转换,然后输出其转换后的单词,否则,直接输出原词.

该程序的主函数main需要两个实参:单词转换文件的名字以及需要转换的文件名.程序执行时,首先检查实参的个数.第一个实参argv[0]是命令名,而执行该程序所需要的两个文件名参数则分别存储在argv[1]和argv[2].

如果argv[1]的值合法,则调用open_file函数打开单词转换文件.假设open操作成功,则读入"单词转换对".以"转换对"的第一个单词为键,第二个为值,调用insert函数在容器中插入新元素.while循环结束后,trans_map容器对象包含了转换输入文本所需的数据.如果该实参有问题,则抛出异常并结束程序的运行.

接下来调用open_file打开要转换的文件.第二个循环使用getline函数逐行读入该文件.因为程序每次读入一行,从而可在输出文件的相同位置进行换行.然偶在内嵌的while循环中使用istringstream将每一行中的单词提取出来.

内层的while循环检查每个单词.判断它是否在转换的map对象中出现.如果再,则从map对象中取出相应的对应的值替代该单词.最后,无论是否做了转换,都输出该单词.同时,程序使用bool值firstword判断是否需要输出空格.如果当前处理的是这一行的第一个单词,则无需输出空格.

int main(int argv,char **argv)

{

map<string,string>trans_map;

string key,value;

if(argv!=3)

    throw runtime_error("wrong number of arguments");

ifstream map_file;

if(!open_file(map_file,argv[1]))

   throw runtime_error("no transformationfile");

while(map_file>>key>>value)

   trans_map.insert(make_pair(key,value));

ifstream input;

if(!open_file(input,argv[2]))

   throw runtime_error("no input file");

string line;

while(getline(input,line)){

istringtream stream(line);//先用getline函数读取整行的内容,为了获得每行中的单词,将一个

                                            //  istringstream对象与所读取的行绑定起来,这样只需要使用普通的

                                            // string操作符即可读出每行中的单词

string word;

bool firstword = true;

while(stream>>word){

   map<string,string>::const_iterator map_it = trans_map.find(wor);

   if(map_it != trans_map.end())

  word = map_it->second;

 if(firstword)

  firstword = false;

else

 cout<<" ";

cout << word;

}

cout<<endl:

}

return 0;

}

 

 

 

 

 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2014-4-6 10:00

傻逼……
相关推荐阅读
用户303375 2011-03-05 20:23
map容器->通过基于家族姓氏的查询输出该家族所有孩子的名字
问题:定义一个map对象,其元素的键是家族姓氏,而值存储该家族孩子名字的vector对象.为这个map容器输入至少6个条目.通过基于家族姓氏的查询检测你的程序,查询输出该家族所有孩子的名字 解决方案:...
用户303375 2011-03-02 22:06
关于map类型:书店问题和统计读入单词的数目
问题1::某书店以文件形式保存每一笔交易,每一笔交易记录某本书的销售情况,含ISBN(国际标准书号,世界上每种图书的唯一标识符),销售册数和销售单价.店主定期查看这个文件,统计每本书的销售册数,总销售...
我要评论
1
2
关闭 站长推荐上一条 /3 下一条