练习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