使用std::ios::tie与std::ios_base::sync_with_stdio加速流
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用std::ios::tie与std::ios_base::sync_with_stdio加速流相关的知识,希望对你有一定的参考价值。
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
对于str标准流,它与C f流同步时,下列三对函数的效果相同。
(1)std::fputc(f, c) 与 str.rdbuf()->sputc(c)
(2)std::fgetc(f) 与 str.rdbuf()->sbumpc()
(3)std::ungetc(c,
f) 与 str.rdbuf()->sputbackc(c)
std::ios::tie
get (1) ostream* tie() const;
set (2) ostream* tie (ostream* tiestr);
第一种形式返回一个指向当前绑定输出流的指针。
第二种形式绑定对象tiestr,并返回一个指针,它指向调用之前绑定的stream流。
【未完待续】
算法竞赛中,关闭iostream对象和cstdio流同步以提高输入输出的效率。
(调用ios::sync_with_studio(false))
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
以上是关于使用std::ios::tie与std::ios_base::sync_with_stdio加速流的主要内容,如果未能解决你的问题,请参考以下文章
std::ios_base::sync_with_stdio(false),优点,缺点?
gcc 未定义对 `std::ios_base::Init::Init()' 的引用
std::ios::sync_with_stdio(false);
使用 std::ios_base::binary 有啥意义?
std::ofstream 无法在 win7/64 和 msvc2013 上使用 std::ios::ate 打开大文件