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;
}
这样。
具体可以看我的其他文章。