第十一章 11.3.1节练习

练习11.15

对一个int到vector<int>的map,其mapped_type、key_type和value_type分别是什么?

解答:

这里就是定义一个

map<int, vector<int>>
然后,来回忆一下类型别名的内容:

【引用】key_type: 此容器类型的关键字类型

【引用】mapped_type: 每个关键字关联的类型;只适用于map

【引用】value_type: 对于set,与key_type相同。对于map,为pair<const key_type, mapped_type>

复习了以上的内容,这道题就相当简单了。

map<int, vector<int>>::mapped_type  --> vector<int>
map<int, vector<int>>::key_type --> int
map<int, vector<int>>::value_type --> pair<const int, vector<int>>

练习11.16

使用一个map迭代器编写一个表达式,将一个值赋予一个元素。

解答:

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(){
	map<int, string> int_to_string;
	int_to_string[1] = "first"; //这里需要简单初始化一下,否则在下面打印的时候,会产生段错误

	auto iter = int_to_string.begin();
	//iter->first = 1; // error, map的value type是pair<const int, string>, first 的值不能改变
	iter->second = "hello";
	cout << iter->first << endl;
	cout << iter->second << endl;
}

练习11.17

假定c是一个string的multiset,v是一个string的vector,解释下面的调用。指出每个调用是否合法:

①copy(v.begin(), v.end(), inserter(c, c.end()));
②copy(v.begin(), v.end(), back_inserter(c));
③copy(c.begin(), c.end(), inserter(v, v.end()));
④copy(c.begin(), c.end(), back_inserter(v));
解答:

这里先看一下copy的等价操作(引用自cplusplus reference)

template<class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result; ++first;
  }
  return result;
}
这段代码将copy所要完成的工作介绍的很清楚。

然后,再看一下以上四个操作。

(以上的操作需要分开进行运行,且保证要拷贝的内容不为空,否则拷贝将无法进行。具体原因,参考等价实现)

①合法,可以将v中的内容插入到c中

②非法,这里back_inserter的操作实现中,使用到了push_back的操作,但是multiset类型没有这个成员函数,编译时会报对应的错误

③合法,将c中的内容按照在multiset的顺序,拷贝进v中

④合法,和③的结果一致。


练习11.18

写出第382页循环中map_it的类型, 不要使用auto和decltype。

解答:

这道题在382页的第一段代码中已经回答了。

【引用】*map_it是指向一个pair<const string, size_t>对象的引用


练习11.19

定义一个变量,通过对11.2.2节(第379页)中的名为bookstore的multiset调用begin()来初始化这个变量。

写出变量类型,不要使用auto或decltype。

解答:

这道题其实和练习11.11差不多。

改一下multiset的定义:

multiset<Sales_data, bool(*)(const Sales_data&, const Sales_data&)>
然后,初始化这个变量。

	multiset<Sales_data, bool(*)(int, int)> bookstore(fun);
	Sales_data test_data;

	// insert some value into bookstore

	multiset<Sales_data, bool(*)(int, int)>::const_iterator set_it = bookstore.cbegin();

	if (set_it != bookstore.cend()){
		test_data = *set_it;
 	}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值