C++快读快写(适用于整数变量)模版(详细注释版)

前言
快读快写就是通过一小部分的手动实现(当然要调一些函数),达到快速输入/输出的效果.
快读
思路
通过从头到尾读取字符,记录是否有负号,其余部分用累加器累加(注意不同数位的处理).
代码

template<typename T> inline void read(T &x) { // template的用法详见https://www.jianshu.com/p/31d7e18372e2,里面的typename代表变量类型,如果换作class代表<>里的变量类型,适用于class类(stack,queue等就是这样实现的)
	T a = 0, b = 1; // a代表除了前面负号(没有负号就不用除)的值,b代表base(大于-1为1,否则为-1)
	char ch; // 输入的字符
	while (ch != '-' && (ch < '0' || ch > '9')) { // 特殊处理负号以及非法字符
		ch = getchar();
	}
	if (ch == '-') {
		b = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') { // 处理剩余合法字符
		a = ((T) a << 3) + ((T) a << 1) + (ch ^ '0');
		// 相当于a = a * 10 + ch - '0',位运算的形式更快
		ch = getchar();
	}
	x = a * b; // 不要忘记为原来的变量赋值
}

快写
思路
首先判断负号,有的话直接输出.然后输出每一位(当大于9时,输出x / 10,然后 x /= 10),调用putchar函数,第二个参数c表示后跟的字符,初始值为’\0’(如果不带这个参数的话就不输出).
代码

template<typename T> inline void write(T x, char c = '\0') {
	if (x < 0) { // 特殊处理负数情况
		putchar('-');
		x = -x;
	}
	if (x > 9) { // 输出每一位(递归)
		write(x / 10);
	}
	putchar(x % 10 + '0'); // 此时x < 10,由于最好不要改变x的值,所以用x % 10
	if (c != '\0') { // 如果有这个参数,就输出
		putchar(c);
	}
}

Goodbye,希望大家有收获吖~

上一篇:黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)E题题解


下一篇:递归法把一个整数通过字符串输出,谭浩强教材习题