C++读入输出优化【附模板(全)】

关闭同步、解除绑定

ios::sync_with_stdio(false);

注意:在使用后进行io操作时不能同时使用cin 与scanf。

另外可以进一步加快执行效率。

ios::sync_with_stdio(false);
cin.tie(0);

读入整数

int read()
{
    int x = 0, w = 1;
    char ch = 0;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
            w = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * w;
}

输出整数

int write(int x)
{
    if(x < 0)
    {
        x = -x;
        putchar('-');
    }
    if(x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}

非递归版输出

 

inline void write1(int x)
{
    static int sta[35];
    int top = 0;
    do
    {
        sta[top++] = x % 10;
        x /= 10;
    }while(x);
    while(top)
        putchar(sta[--top] + '0');
}

输入实数 

inline double dbread()
{
    double X = 0,Y = 1.0;
    int w = 0;
    char ch = 0;
    while(!isdigit(ch))
    {
        w |= ch == '-';
        ch = getchar();
    }
    while(isdigit(ch))
    {
        X = X * 10 + (ch^48);
        ch = getchar();
    }
    ch = getchar();//读入小数点
    while(isdigit(ch))
    {
        X += (Y /= 10) * (ch^48);
        ch = getchar();
    }
    return w ? -X : X;
}

自定义模板类

不适用于字符

template <typename T> inline T read(){ //声明 template 类,要求提供输入的类型T,并以此类型定义内联函数 read()
    T sum=0,fl=1;//将 sum,fl 和 ch 以输入的类型定义
    int ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') fl=-1;
    for(;isdigit(ch);ch=getchar()) sum=sum*10+ch-'0';
    return sum*fl;
}

如果要分别输入 int 类型的变量 a , long long 类型的变量 b 和 _int128 类型的变量 c ,那么可以写成 

    a=read<int>();
    b=read<long long>();
    c=read<__int128>();

示例:

template <typename T> inline int read()
{
    int sum = 0,fl = 1;
    int ch = getchar();
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') fl = -1;
    for(; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0';
    return sum * fl;
}

模板

另外附一份比较全的模板

//fread高速读入 如果用则全部都要用read不能再scanf或cin 测试需要重定向从文件输入数据(只能使用文件读入)
namespace fastIO {
#define BUF_SIZE 100000
#define OUT_SIZE 100000
#define ll long long
	//fread->read
	//快速读入
	bool IOerror = 0;
	inline char nc() {
		static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
		if (p1 == pend) {
			p1 = buf; pend = buf + fread(buf, 1, BUF_SIZE, stdin);
			if (pend == p1) { IOerror = 1; return -1; }
			//{printf("IO error!\n");system("pause");for (;;);exit(0);}
		}
		return *p1++;
	}
	inline bool blank(char ch) { return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t'; }
	inline void read(int &x) {
		bool sign = 0; char ch = nc(); x = 0;
		for (; blank(ch); ch = nc());
		if (IOerror)return;
		if (ch == '-')sign = 1, ch = nc();
		for (; ch >= '0'&&ch <= '9'; ch = nc())x = x * 10 + ch - '0';
		if (sign)x = -x;
	}
	inline void read(ll &x) {
		bool sign = 0; char ch = nc(); x = 0;
		for (; blank(ch); ch = nc());
		if (IOerror)return;
		if (ch == '-')sign = 1, ch = nc();
		for (; ch >= '0'&&ch <= '9'; ch = nc())x = x * 10 + ch - '0';
		if (sign)x = -x;
	}
	inline void read(double &x) {
		bool sign = 0; char ch = nc(); x = 0;
		for (; blank(ch); ch = nc());
		if (IOerror)return;
		if (ch == '-')sign = 1, ch = nc();
		for (; ch >= '0'&&ch <= '9'; ch = nc())x = x * 10 + ch - '0';
		if (ch == '.') {
			double tmp = 1; ch = nc();
			for (; ch >= '0'&&ch <= '9'; ch = nc())tmp /= 10.0, x += tmp * (ch - '0');
		}
		if (sign)x = -x;
	}
	inline void read(char *s) {
		char ch = nc();
		for (; blank(ch); ch = nc());
		if (IOerror)return;
		for (; !blank(ch) && !IOerror; ch = nc())*s++ = ch;
		*s = 0;
	}
	inline void read(char &c) {
		for (c = nc(); blank(c); c = nc());
		if (IOerror) { c = -1; return; }
	}
	//fwrite->write
	//快速写入
	struct Ostream_fwrite {
		char *buf, *p1, *pend;
		Ostream_fwrite() { buf = new char[BUF_SIZE]; p1 = buf; pend = buf + BUF_SIZE; }
		void out(char ch) {
			if (p1 == pend) {
				fwrite(buf, 1, BUF_SIZE, stdout); p1 = buf;
			}
			*p1++ = ch;
		}
		void print(int x) {
			static char s[15], *s1; s1 = s;
			if (!x)*s1++ = '0'; if (x < 0)out('-'), x = -x;
			while (x)*s1++ = x % 10 + '0', x /= 10;
			while (s1-- != s)out(*s1);
		}
		void println(int x) {
			static char s[15], *s1; s1 = s;
			if (!x)*s1++ = '0'; if (x < 0)out('-'), x = -x;
			while (x)*s1++ = x % 10 + '0', x /= 10;
			while (s1-- != s)out(*s1); out('\n');
		}
		void print(ll x) {
			static char s[25], *s1; s1 = s;
			if (!x)*s1++ = '0'; if (x < 0)out('-'), x = -x;
			while (x)*s1++ = x % 10 + '0', x /= 10;
			while (s1-- != s)out(*s1);
		}
		void println(ll x) {
			static char s[25], *s1; s1 = s;
			if (!x)*s1++ = '0'; if (x < 0)out('-'), x = -x;
			while (x)*s1++ = x % 10 + '0', x /= 10;
			while (s1-- != s)out(*s1); out('\n');
		}
		void print(double x, int y) {
			static ll mul[] = { 1,10,100,1000,10000,100000,1000000,10000000,100000000,
				1000000000,10000000000LL,100000000000LL,1000000000000LL,10000000000000LL,
				100000000000000LL,1000000000000000LL,10000000000000000LL,100000000000000000LL };
			if (x < -1e-12)out('-'), x = -x; x *= mul[y];
			ll x1 = (ll)floor(x); if (x - floor(x) >= 0.5)++x1;
			ll x2 = x1 / mul[y], x3 = x1 - x2 * mul[y]; print(x2);
			if (y > 0) { out('.'); for (size_t i = 1; i < y&&x3*mul[i] < mul[y]; out('0'), ++i); print(x3); }
		}
		void println(double x, int y) { print(x, y); out('\n'); }
		void print(char *s) { while (*s)out(*s++); }
		void println(char *s) { while (*s)out(*s++); out('\n'); }
		void flush() { if (p1 != buf) { fwrite(buf, 1, p1 - buf, stdout); p1 = buf; } }
		~Ostream_fwrite() { flush(); }
	}Ostream;
	inline void print(int x) { Ostream.print(x); }
	inline void println(int x) { Ostream.println(x); }
	inline void print(char x) { Ostream.out(x); }
	inline void println(char x) { Ostream.out(x); Ostream.out('\n'); }
	inline void print(ll x) { Ostream.print(x); }
	inline void println(ll x) { Ostream.println(x); }
	inline void print(double x, int y) { Ostream.print(x, y); }	//y为小数点后几位
	inline void println(double x, int y) { Ostream.println(x, y); }
	inline void print(char *s) { Ostream.print(s); }
	inline void println(char *s) { Ostream.println(s); }
	inline void println() { Ostream.out('\n'); }
	inline void flush() { Ostream.flush(); }			//清空
#undef ll
#undef OUT_SIZE
#undef BUF_SIZE
};
using namespace fastIO;

猜你喜欢

转载自blog.csdn.net/qq_41785863/article/details/89397996