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;
}
这样。
具体可以看我的其他文章。
c++方便的输出vector和map_重载的应用 【python一样写c++、二】的更多相关文章
- JAVA中继承时方法的重载(overload)与重写/覆写(override)
JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...
- vector 之 find 重载
众所周知,map有find,但vector的find只能调用algorithm中的find通用方法. 参考<How to find an item in a std::vector?> 对 ...
- 编写一个递归函数,输出vector对象的内容
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- Java实验——输出一个数组里面连续子数组最大的和(二)文件操作
在本周的练习中,主要是对上周的实验进行健壮性的完善,即在所能考虑到的情况之中,尽量使自己的程序能够正常地运行. 在上周的实验中,我已经是在编程过程中考虑到用户输入的错误类型的问题,所以这一方面并没有多 ...
- Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)
齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...
- 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= ...
- 【题解】Jury Compromise(链表+DP)
[题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...
- NumPy线性代数
NumPy - 线性代数 NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能. 此模块中的一些重要功能如下表所述. 序号 函数及描述 1. dot 两个数组的点积 2. vdo ...
- python 字典dict - python基础入门(15)
前面的课程讲解了字符串str/列表list/元组tuple,还有最后一种比较重要的数据类型也需要介绍介绍,那就是python字典,俗称:dict. python中的字典可与字符串/列表/元组不同,因为 ...
- 最简单的???ubuntu 通过crontab定时执行一个程序
crontab在liunx系统中下载,我默认是认为下载安装了的.. crontab貌似只能在liunx系统中存在,如果是windows系统我不知道 创建一个名为jiaoben的文件夹存储sh文件,进入 ...
随机推荐
- vue中,解决chrome下,的warning, Added non-passive event listener to a scroll-blocking ‘mousewheel‘ event 问题
写项目的时候,Chrome 提醒: [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' eve ...
- vue的双向绑定规则
vue提供了v-model双向绑定指令,用来辅助在不操作DOM的前提下,快速读取表单的数据 <!DOCTYPE html> <html lang="en"> ...
- jmeter中返回值提取并存储。
jmeter中,关于对接口提取值如何存入CSV文件并且做到换列操作的处理.我这里简单介绍一下. 1.首先把接口调通(这个是必须条件),确认好需要提取存入csv的字段,这里以统计token跟userid ...
- svn批量忽略文件夹和批量忽略某种类型文件方法
批量忽略文件夹: 最简单的方法:不勾选这个 1.在svn管理的根目录下点击右键---> TortoiseSVN --> properties 2.点击new-->other 3.在p ...
- sqlmap-1.6.12.11
Usage: sqlmap.py [options] 选项: -h, --help 显示基本帮助信息并退出 -hh 显示高级帮助信息并退出 --version 显示程序的版本号并退出 -v VERBO ...
- 计蒜客(Stone Game)01背包
题意:在集合中挑一些数,形成一个集合S,剩下的数形成另一个集合P,使得S>= P ,并且对于S中任意元素ai,S-ai<=P 问有多少种方案. 题目链接:https://nanti.jis ...
- 梯度下降算法VS正规方程算法
梯度下降算法的大家族: ①批量梯度下降:有N个样本,求梯度的时候就用了N个样本的梯度数据 优点:准确 缺点:速度慢 ②随机梯度下降:和批量梯度下降算法原理相似,区别在于求梯度时没有用所有的N歌样本数据 ...
- SQL-分组聚合
-- 语法 select * |列名|表达式 -- 5 from 表名 -- 1 where 条件 ...
- 视觉里程计--视觉slam7.1/相机运动估计视觉算法
视觉里程计 本篇文章记录了少许阅读<视觉slam14讲>的阅读整理,不是特别全面,只是为了本次项目中特定任务搜查资料,时间比较紧,文章并没有全面涵盖所有知识点.日后若时间有空闲,将回来补充 ...
- HashMap长度为什么是2的幂
虽然hash值很多,范围很大,但是内存存不了那么大的数组,所以取hash的散列值的时候,需要用hash值,除以数组长度取余数.又由于取余数(%)的性能不如与运算(&),所以想用与运算来代替取余 ...