众所周知,c++里面的cin,cout等输入输出函数运行时都会有一个缓冲区,这样大大的增加了代码的运行时间,那么,有什么方法使得其运行更快呢?
我们可以用c语言的scanf和printf来输入和输出,从执行速度和效率的角度来看,scanf
和 printf
通常比 cin
和 cout
快。这种差异主要源于以下原因:
-
同步与标准 C I/O:
cin
/cout
与标准 C 的输入输出(即stdin
和stdout
)保持同步。这意味着每次使用cin
或cout
时,都会有一些额外的开销,以保持与标准 C I/O 的同步。而scanf
和printf
直接使用标准 C I/O,没有这样的同步开销。 -
类型安全和错误检查:
cin
/cout
提供了更好的类型安全和错误检查机制。例如,如果你尝试使用cin
读取一个整数到一个字符串变量中,编译器会报错或运行时会失败。而scanf
在这方面就不那么安全,使用不当时容易导致错误。 -
格式化的灵活性:
printf
和scanf
允许更灵活的格式化,但这也意味着它们需要解析格式化字符串,这可能在某些情况下会稍微减慢速度。不过,这种差异通常非常小,除非是在处理大量数据的情况下。
在竞赛编程中,由于速度非常重要,因此 scanf
和 printf
往往是更受欢迎的选择。但在需要类型安全、错误检查或代码可读性方面,cin
和 cout
可能是更好的选择。
但是如果需要更快的方法怎么办?那么我们可以手动读取,就是所谓的卡常,超级快读快写。
卡常的示例题目:kedaOJ P2852. 小鳄鱼的名字
题目描述
可达信奥的学员上课格外积极。学员每提问一个问题,就要叫一次老师的名字“crocodile”。现在学员们提出了n个问题,你需要输出老师的名字被叫了多少次。
输入格式
共一行,一个整数 n,表示学生提出问题的数量。
输出格式
共一行,表示老师的名字被叫了多少次。
样例
输入数据 1
2
输出数据 1
crocodilecrocodile
提示
数据范围
100% 的数据:n≤100000
用超级快读快写解决:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
namespace IO {
int len = 0;
char ibuf[(1 << 20) + 1], *iS, *iT, out[(1 << 25) + 1];
#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
#define reg register
inline int read() {
reg char ch = gh();
reg int x = 0;
reg char t = 0;
while (ch < '0' || ch > '9')
t |= ch == '-', ch = gh();
while (ch >= '0' && ch <= '9')
x = x * 10 + (ch ^ 48), ch = gh();
return t ? -x : x;
}
inline void putc(char ch) {
out[len++] = ch;
}
template <class T> inline void write(T x) {
if (x < 0)
putc('-'), x = -x;
if (x > 9)
write(x / 10);
out[len++] = x % 10 + 48;
}
inline void flush() {
fwrite(out, 1, len, stdout);
len = 0;
}
}
using IO::flush;
using IO::putc;
using IO::read;
using IO::write;
int main() {
int n = read();
for(int i = 0; i < n; ++i) {
const char* crocodile = "crocodile";
for (int j = 0; crocodile[j] != '\0'; ++j) {
putc(crocodile[j]);
}
}
flush();
return 0;
}
在main函数前面的就是手动读入/输出的代码
水题还是要解释一下的,代码要求的是输出n遍一个字符串,我们输入n然后使用for循环输出。
本来一道水题直接提升了一个档次,让我们来看一看AC多数据
在来看一看用普通方法写的:
可以看到测试点4在卡常写法下用时2ms但是在普通方法下用时3ms,这个是数据量很小的时候,如果数据量足够大那么速度将会得到较大提升。