文章目录
前言
失踪人口回归!!!!(芜湖)
浅谈亿下坐牢半个多月了解到的神奇小玩意儿 (黑科技)
一、cin/cout速度++
1.Reason
众所周知,C语言的scanf/printf是比C++< iostream >中的cin/cout要快很多的,所以哪怕是C++党在输入输出上也更倾向于使用scanf/printf (但有一说一,cin/cout用起来是真舒服,容错率大大滴高)
But!!!!
string
记得这个吗??
这个处理字符串类问题时无比好用的东西表示:
(自制表情包,不好勿喷)
2.ios::sync_with_stdio(false)你值得拥有!!
cin/cout之所以效率低,是因为要输出的东西先要存入缓冲区,再输出,效率低
而ios::sync_with_stdio(false)可以打消iostream的输入/输出缓存,使效率与scanf与printf相差无几,大大减少时间
3.食用方法
#include<iostream>
using namespace std;
int main(){
ios::sync_with_stdio(false);
......
......
return 0;
}
与freopen类似,将ios::sync_with_stdio(false); 加在输入输出前即可
cin/cout:三十年河东,三十年河西,莫欺少年穷,我也有站起来的一天
二、i++与++i
1.大佬为何在for循环中更倾向于用++i?
虽然都是自加,但++i效率比i++更高 (神奇的卡常优化又增加了)
2.原理
因为 【CENSORED】 和 【CENSORED】 ,所以 【CENSORED】 (该内容仅对V级员工开放)
简单来说,i++ 是用一个变量存储 i ,再将 i 的值加一,最后返回那个变量(也就是 i 自加之前的值),而 ++i的话就是直接自加,然后返回自己的值,故效率更高。
三、寄存器(卡常党快来)
1.Reason
在某些题目中,总会有一两个测试点故意恶心你,让你Time Limit Exceeded (Time Limit Enough) ,让你不得不放弃先前的努力,去用更令人头疼优的算法&&数据结构。
这种情况下,不妨试一下寄存器,它可以提高变量&&函数的运行效率。
2.方法
register 变量类型 变量名称;
inline 函数类型 函数名称;
举个简单的例子:斐波那契数列
#include<cstdio>
int n;
inline int f(int x){
if(x==1||x==2)return 1;
return f(x-1)+f(x-2);
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;++i)
printf("%d ",f(i));
return 0;
}
PS:我知道这个方法效率低,但该代码只是为了展示寄存器的用法,杠精不要叫。
3.原理
【CENSORED】【CENSORED】【CENSORED】仅对V级员工开放【CENSORED】【CENSORED】【CENSORED】
大可不必详细了解详细内部过程,我也就用尽可能简单易懂的讲解一下。
众所周知,计算机的数据都是存在硬盘里,而CPU进行运算时肯定不是直接用内存里的数据。CPU里面其实是有一小块内存的,当计算时,会先从内存中将需要数据导入到CPU中,在进行运算。当你用了inline/register后:
数据就会直接存在CPU的内存里,所以效率会有提升。
4.注意事项
不要把什么东西都往寄存器里塞!!!!会出现莫名Runtime Error||Memory Limit Exceeded!!!!
一般只有循环变量和频繁使用的函数才使用寄存器。