cin.tie与sync_with_stdio加速I/O
以前总是听说C++的cin
、cout
效率低下,导致我在做算法题的时候总是使用C风格的scanf
、printf
,敲起来真是麻烦得多2333
后来经过学习才发现,其实C++为了兼容C,而在i/o上做了一些文章,cin
、cout
经过手动配置,也能够胜任在算法中的工作
std::cin做了额外的工作
cin
之所以显得慢,是因为出于安全考虑,做了以下两个工作:
- 与
std::cout
绑定。每次std::cin
从缓冲区读入内容之前,会执行std::cout.flush()
刷新缓冲。 - 与
stdio
同步。确保混用 C 风格的 I/O 操作如(scanf
,printf
)不会引发问题。
而如果在编码时能够人为地避免这些问题,就可以省去这些工作,从而达到加速cin
的目的。
std::cin.tie
cin.tie
是将cin
和某个ostream
绑定的函数,空参数的话返回当前的输出流指针。
根据 cplusplus网站 的描述,根据传递的参数不同,该函数具有两种功能:
- (1)无参调用: ostream* tie() const;
- (2)含参调用: ostream* tie (ostream* tiestr);
The first form (1) returns a pointer to the tied output stream.
形式(1)返回当前绑定的输出流指针
The second form (2) ties the object to tiestr and returns a pointer to the stream tied before the call, if any.
形式(2)将cin和tiestr绑定,并返回在这之前绑定的流指针(如果有的话)
The tied stream is an output stream object which is flushed before each i/o operation in this stream object.
绑定的流是一个输出流对象,该对象在每次 i/o 操作之前都会进行刷新。
cplusplus网站还有一个代码示例,为方便理解,在这里贴出我添加了注释的版本:
// redefine tied object
#include <iostream> // std::ostream, std::cout, std::cin
#include <fstream> // std::ofstreamint main() {std::ostream* prevstr;std::ofstream ofs;// ofs 绑定文件 test.txtofs.open("test.txt");// 控制台输出std::cout << "tie example:\n";// cin.tie 返回 std::cout 的指针,字符串输出到控制台*std::cin.tie() << "This is inserted into cout";// 将文件输出流 ofs 绑定在 std::cin 上// 同时返回原先绑定在cin上的输出流指针(指向控制台输出)prevstr = std::cin.tie(&ofs);// cin.tie 返回 ofs 的指针,字符串输出到文件 test.txt*std::cin.tie() << "This is inserted into the file";// 恢复为控制台输出std::cin.tie(prevstr);// 关闭文件ofs.close();return 0;
}
利用形式(2),在默认状态下,我们可以通过给该函数传递空指针,从而解除cin
与cout
的绑定,省去了第一项额外工作的时间,具体代码如下:
std::cin.tie(nullptr);
//或者std::cin.tie(0);
ios::sync_with_stdio
调用该函数可以切换C++流和C流的同步状态
它的原型是:
static bool sync_with_stdio( bool sync = true )
这个同步是默认打开的,所以在默认情况下 C++ 流上做的操作会被同步到相应的 C 流中,这就为混和使用C++流和C流提供了可能。
倘若我们不混和使用C++流和C流(就比如在做算法题的时候),我们可以通过向该函数传递false
参数值,以解除 C++ 流与 C 流的同步:
std::ios::sync_with_stdio(false);
这样一来第二项额外工作也免了。
所以,通过调用这两个函数,我们可以放心地将算法的I/O交给cin
和cout
处理,不用担心因为它们而TLE了
#include <iostream>int main(){std::cin.tie(nullptr);std::ios::sync_with_stdio(false);// 然后写你的代码去吧...
}
cin.tie与sync_with_stdio加速I/O相关推荐
- 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.ht ...
- 【C++】ios::sync_with_stdio(false) 与 cin.tie(nullptr) 加速 IO
目录&索引 一.前言 题目 二.ios::sync_with_stdio(false) 三.cin.tie(nullptr) 四.小结 一.前言 之前写题遇到大数据量(cin.cout 数据量 ...
- 解析 static auto x = []() { std::ios::sync_with_stdio(false);std::cin.tie(nullptr);return 0;}()
前言 这两天在LeetCode上刷题的时候看见有好几个速度排名第一的代码中都有一段类似的代码,如下: static const auto io_sync_off = []() {// turn off ...
- leetcode练习——数组篇(1)(std::ios::sync_with_stdio(false);std::cin.tie(nullptr);)
题号1. 两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复 ...
- C++输入输出流加速器,关闭同步流,ios::sync_with_stdio(false)和 cin.tie(0)
leetcode练习时,总会发现运行时间短的代码都会有类似: static int x=[](){std::ios::sync_with_stdio(false);cin.tie(NULL);retu ...
- cin.tie(NULL)--加速
我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,甚至还相信过C++在IO方面效率低下的鬼话,殊不知这只是C++为了兼容C而采取的保守措施. tie ...
- sync_with_stdio和cin.tie(0); cout.tie(0);
文章目录 sync_with_stdio tie ACM应用 sync_with_stdio 这个函数是一个"是否兼容stdio"的开关,C++为了兼容C,保证程序在使用了std: ...
- cin.tie(0)和ios::sync_with_stdio(false)
cin is tied to the standard output stream cout (see ios::tie), which indicates that cout's buffer is ...
- c++中关于cin.tie以及sync_witch_stdio同步
flush() ostream类的一个方法,作用是将缓冲区的数据刷新到输出文件. /* Flushing files (flush manipulator) */#include <ostrea ...
最新文章
- 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架
- 高数第七章知识点框架
- php ini include,php.ini文件中的include_path设置
- 谁占用了我的Buffer Pool
- Exception in thread “main“ java.lang.IllegalArgumentException: http://www.dmg.org/PMML-4_4(没搞定)
- android ndk调用出错,由于Android-NDK应用程序的权限问题,为什么fopen在本地方法中失败?...
- hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程
- Kafka产品迭代计划(RoadMap)
- [译]JavaScript async / await:好处、坑和正确用法
- Vue学习笔记(一)—— 常用特性
- win10此电脑不见了_微软介绍 Win10 “重置此电脑”失败的解决方法 - 微软
- bzoj2705 [SDOI2012]Longge的问题
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
- opera官方教程-前台
- 计算机科学与技术代码0812,一级学科代码及名称0812计算机科学与技术(2007年)本.doc...
- 2022-7-22 最新IOS免越狱 无需USB连接 无需硬件常驻 可云控 适应大批量设备
- 微信小程序客服自动推送欢迎语php,如何实现小程序客服自动提示回复小程序卡片,弹出对应内容?小程序客服系统...
- 硫化铜纳米粒/ZIF-8复合材料(CuS@ZIF8载体)|UiO-66/CoSO复合材料|ZIF-67纳米晶表面修饰六咪唑环三磷腈
- python自定义函数实例 lite_python 函数小实例
- Excel如何将行高列宽等格式设置一并全复制?