题目:
http://cxsjsxmooc.openjudge.cn/2021t3springall2/039/
分析:
这题很郭炜哈哈。下面一一分析:
myostream_iteraotr<int> output(cout,",");
可以看到我们需要定义一个模版类,构造函数参数是一个ostream对象和string对象(这里主要是下面还有传入“--”的,用char不好处理,而且头文件也给出了string,不用白不用)。
Copy( lst.begin(),lst.end(),output);//传进去一个变量output
template <class T1,class T2>
void Copy(T1 s,T1 e, T2 x)
{
for(; s != e; ++s,++x) //重载myostream_iteraotr的++
*x = *s; //重载myostream_iteraotr的*和=
}
接下来看到在Copy函数中把output变量传了进去,传进去之后还对其进行++,*,=这些骚操作,全重载得了。
++啥用都没有==,也不干活直接重载成void,连返回都省了。
*的话因为旁边还有个=等着,这就得返回一个自身了,不然后面的=没法用。
=更骚了,直接将传进去的变量*s输出。
参考代码:
#include <iostream>
#include <list>
#include <string>
using namespace std;
template <class T1,class T2>
void Copy(T1 s,T1 e, T2 x)
{
for(; s != e; ++s,++x) //重载myostream_iteraotr的++
*x = *s; //重载myostream_iteraotr的*
}
template<class T>
class myostream_iteraotr
{
// 在此处补充你的代码
private:
string c;
ostream & out;
public:
myostream_iteraotr(ostream & _cout, string _c):out(_cout),c(_c){}
void * operator++(){}
myostream_iteraotr & operator*(){
return *this;
}
ostream & operator=(T n){
out << n << c;
}
};
int main()
{ const int SIZE = 5;
int a[SIZE] = {5,21,14,2,3};
double b[SIZE] = { 1.4, 5.56,3.2,98.3,3.3};
list<int> lst(a,a+SIZE);
myostream_iteraotr<int> output(cout,",");//定义myostream_iteraotr
Copy( lst.begin(),lst.end(),output);//传进去一个变量output
cout << endl;
myostream_iteraotr<double> output2(cout,"--");
Copy(b,b+SIZE,output2);
return 0;
}
注:以上代码虽然通过了OpenJudge的样例测试,但受限于本人水平,如有疏漏,恳请斧正。