c++方便的输出vector和map_重载的应用 【python一样写c++、二】

写程序,尤其是调试的时候,会想着直接输出一个map或者vector来调错。

但本来的cout<<没有这种功能。我们就会想了,要是c++能和python一样,直接输出一个列表(vector)或者dict(map),那有多好。

翻翻书可以知道,cout<<的<<也是重载出来的,那我们就再重载一下,来实现自己的功能呗。

老样子,先放成品

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

namespace py_pr{
	template<typename T>
	inline ostream& out_put(ostream& o,const T & x){
		return o<<x;
	}
	inline ostream& out_put(ostream& o,const string& x){
		return o<<"\""<<x<<"\"";
	}		
	inline ostream& out_put(ostream& o,const char* & x){
		return o<<"\""<<x<<"\"";
	}			
	inline ostream& out_put(ostream& o,const char & x){
		return o<<"\""<<x<<"\"";
	}
	template<typename T1,typename T2>
	inline ostream& out_put(ostream& o,const pair<T1,T2> & x){
		out_put(o,x.first);
		o<<": ";
		out_put(o,x.second);
		return o;
	}			
	
}

template<typename T>
ostream& operator<<(ostream &o,vector<T> &x){
    o<<"[";
    for(auto i=x.begin();i<x.end();++i){
		//可以直接for(auto i:x),但是我不知道怎么特判第一个来控制","
        if(i!=x.begin()) o<<", ";
       	py_pr::out_put(o,*i); 
    }
    o<<"]"<<endl;
    return o;
}

template<typename T1,typename T2>
ostream& operator<<(ostream &o,map<T1,T2> &x){
    o<<"{";
	//类似python的格式
    for(auto i=x.begin();i!=x.end();++i){
        if(i!=x.begin()) o<<", ";
        py_pr::out_put(o,*i); 
    }
    o<<"}"<<endl;
    return o;
}


int main()
{
    vector<int> k1={1,2,3,4};
    cout<<k1;
    vector<string> k2={"123","567","789"};
    cout<<k2;
    vector<char> k3={'a','b','c'};
    cout<<k3;
    
    cout<<endl;
    
    map<string,int> m1;
    m1["114"]=1,m1["514"]=2;
    cout<<m1;
    map<string,string> m2;
    m2["114"]="1919",m2["514"]="810";
    cout<<m2;    
}

下面开始讲解。

本文作者XXOY

1.首先实现输出一个vector的功能。

只需要遍历一遍,逐个输出就行了。

可以直接for(auto i:x)
但我要特判第一个不输出逗号,所以还是使用for(auto i=x.begin();i<x.end();++i)
这样进行遍历。

2.加入格式:
给string加一个“”,给pair(map里的元素)改成 x:y的形式
为了区分string和int,通过特判输出""
考虑到复用性,就干脆写几个函数。
感谢@QuadnucYard 大佬的教导。

template<typename T>
inline ostream& out_put(ostream& o,const T & x){
	return o<<x;
	}
inline ostream& out_put(ostream& o,const string& x){
		return o<<"\""<<x<<"\"";
	}	
template<typename T1,typename T2>
inline ostream& out_put(ostream& o,const pair<T1,T2> & x){
	out_put(o,x.first);
	o<<": ";
	out_put(o,x.second);
	return o;
}	

3.重载<<
这个前置芝士请百度。

我们用vector<T>重载

template<typename T>//模板的使用
ostream& operator<<(ostream &o,vector<T> &x){

4.聚合一下

template<typename T>
ostream& operator<<(ostream &o,vector<T> &x){
    o<<"[";
    for(auto i=x.begin();i<x.end();++i){
		//可以直接for(auto i:x),但是我不知道怎么特判第一个来控制","
        if(i!=x.begin()) o<<", ";
       	py_pr::out_put(o,*i); 
    }
    o<<"]"<<endl;
    return o;
}

这样就可以实现了。
再如法炮制,把map的也写了。

template<typename T1,typename T2>
ostream& operator<<(ostream &o,map<T1,T2> &x){
    o<<"{";
	//类似python的格式
    for(auto i=x.begin();i!=x.end();++i){
        if(i!=x.begin()) o<<", ";
        py_pr::out_put(o,*i); 
    }
    o<<"}"<<endl;
    return o;
}

OK!

这么做就可以实现一些骚操作了。

比如


int main()
{
    auto k=input().split();//k的类型是vector<string>
	cout<<k;
    auto c=my_map(my_int,k);//行,能用
    cout<<c;
}

这样。

具体可以看我的其他文章。

input和split

posted @ 2021-07-14 11:46  箱庭  阅读(159)  评论(0编辑  收藏  举报