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


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

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

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

老样子,先放成品

在这里插入图片描述

#include
using namespace std;

namespace py_pr{
	template
	inline ostream& out_put(ostream& o,const T & x){
		return o<
	inline ostream& out_put(ostream& o,const pair & x){
		out_put(o,x.first);
		o<<": ";
		out_put(o,x.second);
		return o;
	}			
	
}

template
ostream& operator<<(ostream &o,vector &x){
    o<<"[";
    for(auto i=x.begin();i
ostream& operator<<(ostream &o,map &x){
    o<<"{";
	//类似python的格式
    for(auto i=x.begin();i!=x.end();++i){
        if(i!=x.begin()) o<<", ";
        py_pr::out_put(o,*i); 
    }
    o<<"}"< k1={1,2,3,4};
    cout< k2={"123","567","789"};
    cout< k3={'a','b','c'};
    cout< m1;
    m1["114"]=1,m1["514"]=2;
    cout< m2;
    m2["114"]="1919",m2["514"]="810";
    cout<

下面开始讲解。

本文作者XXOY

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

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

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

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

template
inline ostream& out_put(ostream& o,const T & x){
	return o<
inline ostream& out_put(ostream& o,const pair & x){
	out_put(o,x.first);
	o<<": ";
	out_put(o,x.second);
	return o;
}	

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

我们用vector重载

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

4.聚合一下

template
ostream& operator<<(ostream &o,vector &x){
    o<<"[";
    for(auto i=x.begin();i

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

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

OK!

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

比如


int main()
{
    auto k=input().split();//k的类型是vector
	cout<

这样。

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

input和split