写程序,尤其是调试的时候,会想着直接输出一个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

c++方便的输出vector和map_重载的应用 【python一样写c++、二】的更多相关文章

  1. JAVA中继承时方法的重载(overload)与重写/覆写(override)

    JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...

  2. vector 之 find 重载

    众所周知,map有find,但vector的find只能调用algorithm中的find通用方法. 参考<How to find an item in a std::vector?> 对 ...

  3. 编写一个递归函数,输出vector对象的内容

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  4. Java实验——输出一个数组里面连续子数组最大的和(二)文件操作

    在本周的练习中,主要是对上周的实验进行健壮性的完善,即在所能考虑到的情况之中,尽量使自己的程序能够正常地运行. 在上周的实验中,我已经是在编程过程中考虑到用户输入的错误类型的问题,所以这一方面并没有多 ...

  5. Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

    齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...

  6. PTA的Python练习题(十二)-第4章-6 输出前 n 个Fibonacci数

    接下来应该做到 第4章-6 输出前 n 个Fibonacci数 了 def fib(n): a,b = 0,1 for i in range(n+1): a,b = b,a+b return a n= ...

  7. 【题解】Jury Compromise(链表+DP)

    [题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...

  8. NumPy线性代数

    NumPy - 线性代数 NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能. 此模块中的一些重要功能如下表所述. 序号 函数及描述 1. dot 两个数组的点积 2. vdo ...

  9. python 字典dict - python基础入门(15)

    前面的课程讲解了字符串str/列表list/元组tuple,还有最后一种比较重要的数据类型也需要介绍介绍,那就是python字典,俗称:dict. python中的字典可与字符串/列表/元组不同,因为 ...

  10. 最简单的???ubuntu 通过crontab定时执行一个程序

    crontab在liunx系统中下载,我默认是认为下载安装了的.. crontab貌似只能在liunx系统中存在,如果是windows系统我不知道 创建一个名为jiaoben的文件夹存储sh文件,进入 ...

随机推荐

  1. Mac预览怎么用 Mac预览功能实用技巧大全

    Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具 ...

  2. IE浏览器a标签无法下载问题解决(IE浏览器a标签download属性不兼容问题解决)

    //下载文件流函数,只支持get方法. export function downBlob(payload) { return new Promise(((resolve, reject) => ...

  3. ES语法(简)

    1.上编写到怎样安装部署elk,这篇记录怎样简单使用.以便于后期复习使用. 2.登录localhost:5601进入开发者模式. 3.初学担心没有数据可以自己PUT数据比较直观的学习语法.这里可以用网 ...

  4. 样式优先级的规则:!important`>行内样式>嵌入样式>外链样式>id选择器>类选择器>标签选择器>复合选择器>通配符>继承样式

    CSS样式的优先级应该分成四大类 第一类`!important`,无论引入方式是什么,选择器是什么,它的优先级都是最高的. 第二类引入方式,行内样式的优先级要高于嵌入和外链,嵌入和外链如果使用的选择器 ...

  5. PSPNet 代码分析

    https://www.lmlphp.com/user/62501/article/item/1225624/ train.py 网络训练主函数,主要操作有: 传入训练参数:通常采用argparse库 ...

  6. Django框架搭建web项目(三)

    参考官网文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial02/ 在生成的app中进行数据库表设计. 1.在路径H:\myproj ...

  7. JSON详述

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写 使用json函数需要导入json库,import json json.dumps  将p ...

  8. PTA1004 成绩排名 (20 分)

    PTA1004 成绩排名 读入 n(>0)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 ...

  9. springboot项目记录3用户注册界面

    九.注册-前端页面 1.在register页面中编写发送请求的方法,采用点击事件来完成.选中对应的按钮(JQuery下的)(( " 选 择 器 " ) ) , 选 中 某 一 个 ...

  10. 几行python代码完美操控手机

    最近一直成谜于python代码带来的便利,今天打算学习下用python代码来控制操作手机,首先需要利用adb,通过安卓调试桥来达到目的,其实也可以用appium来实现,不过appium多数用在自动化测 ...