此程序说明如何创建,查找和迭代遍历一个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;
}
用户377235 2014-4-6 10:00