写程序,尤其是调试的时候,会想着直接输出一个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. python菜鸟学习: 7. 购物车升级版,用户、商品信息存储,修改,新增

    # -*- coding: utf-8 -*-import os'''用户入口:1. 商品信息存在文件里2. 已购商品,余额记录商家入口1. 可以添加商品,修改商品价格商品信息:commdList.t ...

  2. 一个分布式websocket的实现

    前情提要 之前我的项目里有一个合作编辑的功能,多个客户端的用户可以合作写一篇文章的不同部分,而且合作的任意作者互相还可以进行文字通讯.这种需求肯定是首选websocket了,因为服务器需要主动给客户端 ...

  3. phpmyadmin scripts/setup.php 反序列化漏洞(WooYun-2016-199433)(Kali)

    ​ phpmyadmin 2.x版本中存在一处反序列化漏洞,通过该漏洞,攻击者可以读取任意文件或执行任意代码. 通过vulhub靶场进行复现操作 1.首先搭建靶场环境(采用Kali) cd vulhu ...

  4. CDH命令

    1.检查http服务是否开启 systemctl status httpd.service 本次没有开启是因为删了Log日志 通过查看http状态发现里面有个引用问题 重新建一个空的Log文件夹重启服 ...

  5. SpringBoot(概述、起步依赖原理分析、SpringBoot配置(配置文件分类、YAML))

    SpringBoot概述 Spring Boot 是由 Pivotal 团队提供用来简化 Spring 的搭建和开发过程的全新框架.随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手 ...

  6. CentOS 8.x下编译php 7.4、php5.6、php5.3多版本报错处理教程

    一.编译安装php 7.4.x 参考CentOS 8.0.1905编译安装Nginx1.16.1+MySQL8.0.18+PHP7.3.10 1.安装编译工具及库文件(使用yum命令安装) yum i ...

  7. C#MSDN简体中文 最后一版本 2007年的

    我在学习C# 需要 先看 MSDN文档,英文看的很吃力,就找了好久 MSDN简体中文版本的: 因为微软已经关闭网站(MSDN中文的链接),我找到的就是  磁力链接的: 我分享出来 ,有需要的 自行下载 ...

  8. upload 上传文件

    func SaveUploadedFile(file *multipart.FileHeader, dst string) error{ src, err := file.Open() if err ...

  9. 阿里云Linux服务器部署JDK8实战教程

    下载地址 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 文件上传 把下载的文 ...

  10. eset node32卸载记录

    安装的是这个东西,卸载麻烦 1.一般的卸载软件比如wise program uninstall无论是普通卸载还是强制卸载都是实现不了的,火绒自带的文件粉碎是可以使用的,有两个目录要进行粉碎C:\Pro ...