【算法竞赛】c++编程小技巧 | 解决acm等算法竞赛中TLE问题,如何在不涉及算法的情况下有效给代码提速| register关键字 | Cin、Cout加速 | 快读算法

6 篇文章 0 订阅
6 篇文章 0 订阅

编程小技巧 | 解决acm等算法竞赛中TLE问题,如何在不涉及算法的情况下有效给代码提速

一、register关键字

register 关键字会引导变量存储在寄存器中, 而不是内存,寄存器中存取得速度远远优与内存,但是寄存器数量有限,因此可以把少量频繁使用得变量设为 register 关键字,由此加快代码运行速度。

例如:临时的循环变量 i 就很适合使用 register

for (register int i = 1; i <= M; i++) {
		cout << i << endl;
}

注意!

register 变量必须时单个值(不能是数组),并且长度小于等于整形长度

二、Cin,Cout加速代码

这个代码可以使 cin, cout 执行效率贴近 scanf 和 printf
但是 cin, cout 不能和 scanf, printf 混用了

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

三、快读

快读int模板

inline int read(){
    register int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}

这个模板可以从 int 延续到 longlong

拆解

inline int readInt() {
		register int x = 0, f = 1;  // x是数的绝对值,f表示符号
		char c = getchar();  // getchar()获取内容
		while (c < '0' || c>'9') {
				if (c == '-') f = -1;  // 如果符号为负,设置f为-1
				c = getchar();  // 下一个
		}  //现在已经消除所有非数字字符了,下面的就都是数字
		while (c >= '0' && c <= '9') {
				x = (x << 3) + (x << 1) + (c ^ 48);  //把每一位往上加并使用位运算提速
				c = getchar();  //下一个
		}
		return x * f;
}

快读char模板

inline char readChar(){
		return getchar();
}

快读char*模板

void readCStr(char *str){
		char c = getchar();
		while (blank(c)) c = getchar();
		int p = 0;
		for (str[p++] = c; !blank(c = getchar()); str[p++] = ch);
		c[p] = '\0';
}
bool blank(char c){
    return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}

快读string模板

// 在char*模板的基础上进行转换
string readString(){
    char strBuf[10000];
    readCStr(strBuf);
    string s = strBuf;
    return s;
}

完整类模板

class Scanner{
private:
    bool blank(char c);
public:
    int readInt();
    long long readLL();
    char readChar();
    void readCStr(char *c);
    string readString();
}
inline int Scanner::readInt(){
    register int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
inline long long readLL(){
    register long long x=0;int f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
inline char Scanner::readChar(){
    return getchar();
}
inline void Scanner::readCStr(char *c){
    char ch = getchar();
    while (blank(ch)) ch = getchar();
    int p = 0;
    for (c[p++] = ch; !blank(ch = getchar()); c[p++] = ch);
    c[p] = '\0';//结尾
}
inline string Scanner::readString(){
    char strBuf[10000];
    readCStr(strBuf);
    string s = strBuf;
    return s;
}
inline bool Scanner::blank(char c){
    return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}

inline内联函数

可给函数加速

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MuShan-bit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值