039:我自己的 ostream_iterator

题目:

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的样例测试,但受限于本人水平,如有疏漏,恳请斧正。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值