template fastread
昨天梦到一种快读,你给他传多少参,他就读多少数
今天学了折叠表达式和隐式转换,现在来把这玩意实现一下
特化函数
void read(int)
读入一个整数
void read(char&[],range=size_t)
按数组大小读入一个字符串
void readarray(T x,T2&[])
先读入一个整数 \(x\),再读入 \(x\) 个数字,传入数组
一般函数
void read(...Args)
读入若干变量. 仅限于整数类型,数组或字符串
void readact(int,function<>,...Args)
第一个参数为执行次数,为第三个参数及以后的全部参数执行读入,再传入第二个参数内执行.
使用例
读入下列数据:
1
5
1 2 3 4 5
int n,a[6];
readarray(n,a);
2
1 3 5
int u,v,w;
read(u,v,w);
int a[4];
read(a,3);
3
图论建边
4 3
1 2
2 3
3 4
read(n,m)
for(int i=1;i<=m;++i){
read(u,v,w);add(u,v,w);
}
function<auto> r=add;
read(n,m);readact(m,r,u,v,w);
代码
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void read(T& x){
x=0;bool sym=0;char c=getchar();
while(!isdigit(c)){sym^=(c=='-');c=getchar();}
while(isdigit(c)){x=x*10+c-48;c=getchar();}
if(sym)x=-x;
}
template<size_t N>
inline void read(char (&str)[N]){
size_t n=0;char c=getchar();
while(n<N-1&&!isspace(c)){str[n]=c;c=getchar();++n;}
str[n]=0;
}
template<typename T,size_t N>
inline void read(T (&a)[N],int range=N){
for(int i=1;i<=range-1;++i){read(a[i]);}
}
template<typename T,typename... Args>
inline void read(T& x,Args&... args){
read(x);read(args...);
}
template<typename T,typename T2>
inline void readarray(T& x,T2& args){
read(x);read(args,x);
}
template<typename func,typename... Args>
inline void readact(int x,function<func>fu,Args&... args){
for(int i=1;i<=x;++i){
read(args...);
fu(args...);
}
}