在C++中,快速读取主要用于提升输入操作的效率,尤其是在处理大规模数据时。
快读的优点
相比于cin
,快速读取方法通常具有以下优点:
1. 速度更快
-
cin
的缺点:cin
是C++标准库中的输入流,虽然易用,但默认情况下它与stdin
同步,且会进行类型检查,导致性能较低。 -
快速读取的优点:通过使用C标准库函数(如
scanf
)或手动实现的快速读取函数(如getchar
),可以显著减少输入操作的时间。
2. 减少开销
-
cin
的缺点:cin
会进行额外的类型检查和格式化操作,增加了运行时的开销。 -
快速读取的优点:快速读取方法通常直接读取字符并手动解析,避免了这些额外开销。
3. 适用于大规模数据
-
cin
的缺点:在处理大规模数据时,cin
的性能瓶颈会变得明显。 -
快速读取的优点:快速读取方法特别适合处理大规模数据输入,如算法竞赛中的大数据量场景。
4. 灵活性
-
cin
的缺点:cin
的格式化输入功能有限,难以应对复杂的输入格式。 -
快速读取的优点:快速读取方法可以根据具体需求灵活处理输入格式。
快读:
快读相比cin的优点说人话就是在读取已知类型的大量数据时(例如算法题中输入的动辄几千个的数据),可以免去类型检查并进行快读读取(依靠getchar),自己定义的读取函数更加灵活(比如可以把一个6位整数的前3位和后三位分别读取)。
读取正int型:
int read() {
int x = 0;
char ch = getchar();
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch - '0');
ch = getchar();
}
return x;
}
读取正反int型:
int read() {
int x = 0,f=1;
char ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch - '0');
ch = getchar();
}
return x*f;
}
使用C++的引用更加简洁:
void read(int &n) {
int x = 0,f=1;
char ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch - '0');
ch = getchar();
}
n= x*f;
}
int main() {
int n;
read(n);
cout<<n;
}
cin和cout的加快
ios::sync_with_stdio(false);
cin.tie(nullptr);
1. ios::sync_with_stdio(false)
的作用
- 默认行为:C++ 的标准输入输出(
cin
/cout
)默认与 C 的标准输入输出(stdio
)保持同步。这意味着每次cin
/cout
操作后,都会刷新缓冲区,以确保 C 和 C++ 的输入输出函数混合使用时的正确性。 - 关闭同步:
ios::sync_with_stdio(false)
会关闭这种同步机制,从而减少不必要的缓冲区刷新操作,大幅提升输入输出速度。 - 适用场景:当代码中不混用
cin
/cout
和 C 的scanf
/printf
时,可以安全地关闭同步。
2. cin.tie(nullptr)
的作用
- 默认绑定:
cin
默认与cout
绑定(即cin.tie(&cout)
)。每次执行cin
操作前,会自动刷新cout
的缓冲区。 - 解除绑定:
cin.tie(nullptr)
会解除cin
与cout
的绑定,避免每次输入前强制刷新输出缓冲区,进一步提升输入效率。 - 注意:如果需要确保
cout
的输出在cin
输入前刷新(例如交互式程序),则不应解除绑定。 - 不能进行交互,所有cout一起输出