第十一章 11.3.2节练习

来源:互联网 发布:美姿堂专业彩妆护淘宝 编辑:程序博客网 时间:2024/06/05 17:44

练习11.20

重写11.1节练习(第376页)的单词计数程序,使用insert代替下标操作。你认为哪个程序更融入编写和阅读?解释原因。

解答:

#include <iostream>#include <map>#include <sstream>using namespace std;int main(){map<string, size_t> word_count;string word;while (cin >> word){auto ret = word_count.insert(make_pair(word, 1));if (!ret.second){++ret.first->second;}}for (const auto &w : word_count){cout << w.first << " occurs " << w.second<< ((w.second > 1) ? " times" : " time") << endl;}return 0;}
通过insert的返回值来做这道题。代码书上已经给出,不过需要详细的看一下 “检测insert的返回值”这一节。


练习11.21

界定word_count是一个string到size_t的map,word是一个string,解释下面循环的作用:

while(cin >> word)    ++word_count.insert({word, 0}).first->second;
解答:

while (cin >> word){auto ret = word_count.insert(make_pair(word, 1));if (!ret.second){++ret.first->second;}}
这段循环其实就是对上面代码的简写。

下面分步解释下:

{word, 0} // 一个列表,可以将其看做为一个pair
word_count.insert({word, 0}) //将这个pair插入到map中,并插入的pair
word_count.insert({word, 0}).first<span style="font-family: Arial, Helvetica, sans-serif;">->second  </span>// 得到pair中的第二个值,也就是计数值
++word_count.insert({word, 0}).first->second; //将计数值加1。当原有map中没有该word的时候,计数值应为1;有的话则继续累加。

在书中385页,也有分步的解释。


练习11.22

给定一个map<string, vector<int>>,对此容器的插入一个元素的insert版本,写出其参数类型和返回类型。

解答:

参照之前的几道题,这道题目就很好回答了。

参数类型{string,vector<int>}或make_pair(string, vectot<int>),pair<string, vector<int>(..., ...)>, map<string, vector<int>>::value_type(..., ...)

返回类型pair<string, vector<int>>


练习11.23

11.2.1节练习(第378页)中的map以孩子的姓为关键字,保存他们的名用vector,用multimap重写此map。

解答:

#include <iostream>#include <map>#include <string>using namespace std;int main(){multimap<string, string> family;string family_name, giving_name;while (cin >> giving_name){cin >> family_name;family.insert(pair<string, string>(family_name, giving_name));}for (multimap<string, string>::iterator it = family.begin();it != family.end(); ++it){cout << it->first << " " << it->second << endl;}return 0;}
之前就是用multimap来写的,所以直接粘过来了XD

0 0
原创粉丝点击