C++你不知道的小技巧(失踪人口回归)

发布于:2023-01-04 ⋅ 阅读:(343) ⋅ 点赞:(0)


前言

在这里插入图片描述

失踪人口回归!!!!(芜湖)

浅谈亿下坐牢半个多月了解到的神奇小玩意儿 (黑科技)


一、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!!!!
一般只有循环变量和频繁使用的函数才使用寄存器。


码字不易,会不定期更新,求点赞、收藏、关注!!

本文含有隐藏内容,请 开通VIP 后查看