goodcopy
描述
编写GoodCopy类模板,使得程序按指定方式输出。
|
|
输入
第一行是整数 $t$ ,表示数据组数。
每组数据第一行是整数 $n,n < 50$ 。
第二行是 $n$ 个整数,第三行是 $n$ 个字符串。
|
|
输出
将输入的整数原序输出两次,用",“分隔。
然后将输入的字符串原序输出两次,也用 “,“分隔。
|
|
Solution
看这句语法GoodCopy<int>(a,a+m,b),它通过默认构造函数创建了一个GoodCopy类对象(结构体,不用管public,自动public的),然后这个类通过重载()运算符对传入参数进行操作,类似于函数,在之后的学习中,这种形式通常被称为仿函数。
然后,这里重载的()运算符接受一个起始指针T*,一个终止指针T*,还有一个目的指针T*,将起始指针到终止指针之间的部分复制到目的指针处。
注意,这里复制应该从后往前复制,否则可能覆盖数据。
|
|
按距离排序
描述
根据输出完善程序。
|
|
输入
多组数据,每组一行,是一个整数 $n$ 和一个字符串 $s$ 。
|
|
输出
定义两个整数的距离为两个整数差的绝对值,定义两个字符串的距离为两个字符串长度差的绝对值。
对每组数据:
对数组 $a$ 按和 $n$ 的距离从小到大排序后输出。距离相同的,值小的排在前面。
然后对数组 $b$ ,按照和 $s$ 的距离从小到大输出。距离相同的,字典序小的排在前面。
|
|
Solution
这里可以看到,Closer生成了一个匿名对象,用于sort的比较器。
同时,结合上一题的经验,它作为仿函数接受一个int/string类型参数和一个函数指针,即int*(int,int)和一个int*(const string&,const string&),这里直接用T1和T2替代。
接着看,由于sort每次调用是采用()运算符,因此重载()运算符来实现仿函数的比较即可。
|
|
很难蒙混过关的CArray3D三维数组模板类
描述
实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,输出指定结果。
|
|
输入
|
|
输出
|
|
提示
建议做法:
-
a[i][j][k] 这个表达式的第一个[]返回一个内部类的对象,该内部类也重载了[],且返回值为指针。
-
必要时需重载对象到指针的强制类型转换运算符。
Solution
这道题绝对是前期的难题,建议先看之前作业中笔者对二维题目的解释elainafan-运算符重载 。
好的,开始看这题代码,首先看主函数。
可以看到使用模板类先实例化了a和b,转换构造函数传入的三个参数分别是三个维度的大小,于是使用T*指针向堆取这么多的空间。
其实这样更符合计算机内部的行为,也就是无论多少维数组的空间都是连续的。
然后往下看,由于有a[i][j][k]这种语句,而这次使用的不是三维指针,因此需要在其内部声明一个CArray2D模板类,这个类也有一个T*指针,而重载CArray3D类的[]运算符时,直接返回CArray2D类,它的T*指针可以通过计算机寻址方式得出,顺便也可以传入它的各维参数。
对于CArray2D类,直接重载它的[],按照计算机的模拟寻址方式,返回一个T*指针,然后最后一个[],就根据T*自带的就行。
最后,由于主函数中有memset(a[1],-1,20*sizeof(int))这样的函数,而根据平时使用的惯例,第一个参数都是数组开头,也就是一个指针,因此需要实现将CArray2D转换为T*的强制类型转换函数。
|
|
函数对象的过滤器
描述
根据输出完善程序。
|
|
输入
多组数据,每组数据两行。
第一行是两个整数 $m$ 和 $n$ ,第二行先是一个整数 $k$ ,然后后面跟着 $k$ 个整数。
|
|
输出
对每组数据,按原顺序输出第二行的后 $k$ 个整数中,大于 $m$ 且小于 $n$ 的数输出两遍,数据保证一定能找到符合要求的整数。
|
|
Solution
本题还是要求通过仿函数实现一个FilterClass类,它传入m和n作为转换构造函数的参数。
然后,再看给定的Filter函数,它的op就是传入的FilterClass类对象,因此应该重载()函数进行判断。
|
|
白给的list排序
描述
根据输出完善程序。
|
|
输入
|
|
输出
|
|
Solution
这道题确实白给,原因是STL提供了降序排序仿函数greater<T>()和升序排序仿函数less<T>(),于是就做完了。
|
|
我自己的ostream_iterator
描述
根据输出完善程序。
|
|
输入
|
|
输出
|
|
Solution
在elainafan-从零开始的输入输出与模板
中,有一道山寨版istream_iterator的题,当时需要参考istream_iterator的正确实现做题。
这里查找资料,如下:
|
|
于是这里看懂了,也就是它的转换构造函数需要传入一个ostream&类变量和一个用于分隔输出的字符串进行运算。
同时,还需要重载=、前自加和*三个预算符,按照上面的实现即可,不要忘记加上分隔符。
|
|