第十一章 11.3.2节练习

练习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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值