一、ios::sync_with_stdio(false);
作用:数据(文件)读取速度更快
算法竞赛中,关闭iostream对象和cstdio流同步以提高输入输出的效率。
即调用ios::sync_with_stdio(false);
特别注意:
(1)关闭后C++ IO与CIO不能混用,cin不能与scanf,sscanf, getchar, fgets等混用,cout不能与printf,puts等混用,否则IO会混乱。
(2)在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。即调用std::cin.tie(0);
#include <iostream>
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
// 下面进行IO
}
注:
C++ 双冒号开头的语法功能:命名空间限定
如:
std::string //表示std命名空间下的 string类
补充:双冒号(::)用法
(1)表示“域操作符”例:声明了一个类 A ,类 A 里声明了一个成员函数 void f() ,但没有在类的声明里给出 f 的定义,那么在类外定义 f 时,
就要写成 void A::f() ,表示这个 f() 函数是类 A 的成员函数。
(2)直接用在全局函数前,表示是全局函数
例:在 VC 里,你可以在调用 API 函数前,在 API 函数名前加::
(3)表示引用成员函数及变量,作用域成员运算符
std是一个全局命名空间 ios是一个内部命名空间(位于std下)
所以引用方式如下
::std::ios::ostream
::std::string
当没有冲突的时候,全局的::(也就是第一个)可以省略
二、使用std::ios::tie与std::ios_base::sync_with_stdio加速流
1. std::ios_base::sync_with_stdio
与cstdio流[静态]切换同步
打开或关闭所有的标准iostream流与它们对于的标准C流之间的同步。
实际上,这意味着C++和C流使用相同的缓冲区,因此,可以自由地混合使用流。同步C++标准流可以确保线程安全。
默认情况下,iostream对象和cstdio流同步。如果同步关闭,C++标准流独立地缓冲输入输出,在某些情况下,这是相当快速的。
参数
syn
用于指示是否同步的布尔值,值为true开启同步,为false时关闭同步。
返回值
返回被调用之前的同步状态。当它第一次被调用,总是返回true。
使用样例
#include <iostream>
#include <cstdio>
int main()
{
std::cout.sync_with_stdio(false);
std::cout << "a\n";
std::printf("b\n");
std::cout << "c\n";
}
程序输出
b
a
c
2. std::ios::tie
在默认的情况下cin绑定的是cout,c++11中cin和cerr都默认和cin绑定。
其它加速方法
使用'\n'或者"\n"代替endl。即使用cout<<'\n';和cout<<"\n";