精华内容
下载资源
问答
  • C++中ios::sync_with_stdio(false)的解释
    千次阅读
    2022-02-04 10:13:00

    #include<bits/stdc++.h>为c++的万能头文件,在程序中加入该头文件

    c++中输入输出有两种方式:

    1.cin,cout 

    2.scanf,printf

    第一种方式,输入输出效率较低因为这种方式要先把输出的东西存入缓冲区,再输出,导致效率低,而ios::sync_with_stdio(false)这句话可以打消iostream的输入输出缓存,来使效率变高

    更多相关内容
  • std::ios::sync_with_stdio(false); cin.tie(0); return 0; } 可以增强cin和cout的效率。 在做acm一些题时,经常出现 数据集超大造成 cin读入过多 超时的情况。 这是因为在c++中cin,cout虽然方便但是效率低。 ...
  • ios::sync_with_stdio(false); cin.tie(NULL); 我真傻,真的,我单知道语言不可能限制我的分数,我单认为这是什么玄学加速,加速不可能靠这些东西,这辈子都不可能,我不信邪。今天我敲这一题直30分超时反复检查,...
  • 索引一、前言题目二、ios::sync_with_stdio(false)三、cin.tie(nullptr)四、小结 一、前言 前面遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),考虑因为 IO 性能报错 TLE 选择 scanf、printf 替代 cin、cout,...


    一、前言

    之前写题遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),因为考虑 IO 性能报错 TLE,故选择 scanf、printf 替代 cin、cout,以解决问题。一直以来没有深入研究其中原因,只知关键词——同步,虽是本质但差之千里,今究其因,记录本文。

    针对上述场景无法 AC,起因是打 LC 周赛发现 top 选手用的下述代码:

    // 已做相关改进,包括 cin.tie(0) 被替换为 cin.tie(nullptr),删掉不必要的 cout.tie(0),因不涉及本文主题故不详细展开
    using namespace std;
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    

    题目

    (以本题最短路,报错 TLE 为例——附题解传送)


    二、ios::sync_with_stdio(false)

    在调用 ios::sync_with_stdio(false) 后,cout 与 stdout 不再共享同一块缓冲区,它们分别管理自己的缓冲区。简述,函数作用为设置标准 C++ 流是否与标准 C 流在每次输入/输出操作后同步(官方文档,见下图)。

    正是因为这种同步,所以 cin、cout 比 scanf、printf 速度要慢,如果我们在使用 cin、cout 输入输出前加一句 ios::sync_with_stdio(false),即取消缓冲区同步,可节省时间,效率与 scanf、printf 相差无几。

    具体功能,需要注意以下几点:

    1、实践中,这表示同步的 C++ 流为无缓冲,而每次 C++ 流上的 I/O 都立即应用到对应 C 流的缓冲区。这使得能自由地混合 C++ 与 C I/O 。
    2、同步的 C++ 流保证为线程安全(从多个线程输出的单独字符可能交错,但无数据竞争)。
    3、若关闭同步,则允许 C++ 标准流独立地缓冲其 I/O ,可认为这在某些情况下更快。
    4、所有八个标准 C++ 流默认与其相应的 C 流同步。
    5、若在标准流上已出现 I/O 后调用此函数,则行为是实现定义的:有的实现无效果,有的实现销毁读取缓冲区。


    三、cin.tie(nullptr)

    tie 是一个函数,将两个 stream 绑定,空指针的话返回当前输出流指针(官方文档,见下图)。

    函数介绍(注意返回值):

    std::basic_ostream<CharT,Traits>* tie() const; // 返回当前联系流。若无联系流,则返回空指针。
    std::basic_ostream<CharT,Traits>* tie( std::basic_ostream<CharT,Traits>* str ); // 设置当前联系流为 str ,返回操作前的联系流。若无联系流,则返回空指针。

    cin 默认是与 cout 绑定,所以每次 cin 操作的时候都在联系流(即输出流)调用 flush(),这样增加了 IO 负担,通过 cin.tie(nullptr) 来解除 cin 和 cout 之间的绑定,进一步加快执行效率。同时,解除绑定带来的效果,详述如下:

    cin 默认绑定了 cout 来同步在控制台输出。“绑定”的效果,每当被“绑定”的对象有出入或输出操作,就会即时刷新(本质,在一定刷新频率下刷新)“绑定”的对象的缓冲区,以达到即时回显的效果。cout 没有默认绑定其他输出,所以 cout.tie() 获取到空指针。

    代码验证:

    #include <iostream>
    using namespace std;
    
    int main() {
        cout << "cin.tie(): " << cin.tie() << endl;
        cout << "cin.tie(nullptr): " << cin.tie(nullptr) << endl; // 返回操作前的联系流
        cout << "cin.tie(): " << cin.tie() << endl;
        cout << endl;
        cout << "cerr.tie(): " << cerr.tie() << endl;
        cout << "cerr.tie(nullptr): " << cerr.tie(nullptr) << endl; // 返回操作前的联系流
        cout << "cin.tie(): " << cin.tie() << endl;
        cout << endl;
        cout << "clog.tie(): " << clog.tie() << endl;
        cout << "cout.tie(): " << cout.tie() << endl;
        return 0;
    }
    

    输出:

    cin.tie(): 0x55dea3046140
    cin.tie(nullptr): 0x55dea3046140
    cin.tie(): 0
    
    cerr.tie(): 0x55dea3046140
    cerr.tie(nullptr): 0x55dea3046140
    cin.tie(): 0
    
    clog.tie(): 0
    cout.tie(): 0
    

    四、小结

    对文章内容有不解,请随时留言。


    展开全文
  • ios::sync_with_stdio(false); 的副作用

    千次阅读 2022-01-18 10:31:28
    ios::sync_with_stdio(false); 的副作用 sync_with_stdio() 用处是“关闭同步”,从而加快cin与cout的效率。 在部分机子上如果开了这个函数cin和cout跑的还比printf和scanf快。 但是用了sync_with_stdio(false)之后...

    ios::sync_with_stdio(false); 的副作用

    看这里
    look here
    come on

    sync_with_stdio() 用处是“关闭同步”,从而加快cin与cout的效率。
    在部分机子上如果开了这个函数cin和cout跑的还比printf和scanf快。
    但是用了sync_with_stdio(false)之后不能与printf和scanf同用,否则会出错。

    所以,

    要不就全部scanf,printf,

    要不就ios::sync_with_stdio(false)+全部cin,cout,

    不要混用避免不必要的WA.

    #include <bits/stdc++.h>
    //#include <iostream>
    //#include <stdio.h>
    //#include <algolrithm>
    //#include <map>
    using namespace std;
    map<string ,string> mp;
    int main(int argc, char** argv) {
    	ios::sync_with_stdio(false); cin.tie(0);
    //	string str,a,b;
    //	while(getline(cin,str)){
    //		sscanf(str,"%s %s",a,b);
    //		mp[b]=a;//关键字,对应的值 
    		mp.insert(pair<string,string>(b,a));
    		mp.insert(make_pair(b,a));
    //	}
    //sscanf中的参数是const char*,string类型的a,b无法作为sscanf函数的参数
    char a[15],b[15],str[30];
    map<string,string> mp;
    while(cin.getline(str,30)&&strlen(str)!=0){
    	sscanf(str,"%s %s",a,b);
    //	mp[b]=a;
    //	mp.insert(pair<string,string>(b,a));
    	mp.insert(make_pair(b,a));
    } 
    while(cin>>str){//~scanf("%s",str)
    //	map<string,string>::iterator it;
    //	it=mp.find(str);
    //	if(it!=mp.end()){
    //			cout<<it->second<<endl; 
    //	}
    //	else cout<<"eh"<<endl;
    		if(mp.count(str)){
    			cout<<mp[str]<<endl; 
    	}
    	else cout<<"eh"<<endl;
    }
    		return 0;
    }
    

    while(cin>>str){ //~scanf("%s",str)
    这里scanf和cout混用就会wa,除非注释掉ios::sync_with_stdio(false)
    // map<string,string>::iterator it;
    // it=mp.find(str);
    // if(it!=mp.end()){
    // cout<second<<endl;
    // }
    // else cout<<“eh”<<endl;
    if(mp.count(str)){
    cout<<mp[str]<<endl;
    }
    else cout<<“eh”<<endl;
    }

    展开全文
  • ios::sync_with_stdio(false)

    2022-03-25 10:08:30
    ios::sync_with_stdio(false)的一些小知识

    在C++中的输入和输出有两种方式,

    • 一种是scanf和printf
    • 另一种是cin和cout,
    • 在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的

    C++和C很相似,很多大佬都用C++写C,但是在后面的一种方式中cin和cout的输入和输出效率比第一种低,
    cin &cout 的输出方式比 print&scanf的效率低

    原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,

    ios::sync_with_stdio(false);而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几

    还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。

    参考博客:https://blog.csdn.net/weixin_44015865/article/details/84974373

    展开全文
  • c++中cin,cout效率比较低,是因为先把要输出的东西存入缓冲区与C语言中的stdio同步后,再输出,导致效率降低,而这段语句的作用是取消缓冲区同步,直接使用,由此可节省时间,使效率与scanf与printf相差无几。...
  • 默认的时候,cin与stdin总是保持同步的,...所以一般会用ios::sync_with_stdio(false)来取消cin与stdin的同步,从而使cin达到和scanf相差无几的输入效率。 代码如下: ios::sync_with_stdio(false); cin.tie(0); ...
  • If the streams are synchronized, a program can mix iostream operations with stdio operations, and their observable effects are guaranteed to follow the same order as used in the thread. 解除与c输入...
  • 经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题困扰,每次只能打scanf和printf,然后一堆的占位符巨麻烦),这是因为C++中,cin和cout要与stdio同步,中间会有一个缓冲,所以...
  • 但是cin和cout也有它的缺点,就是输入输出较scanf和printf而言要慢,因此很多人写代码时会加上句ios::syn_with_stdio(false)来提高cin和cout的效率,原先一直听人说这样写可能会引发问题,但却不知道具体是什么问题...
  • 如今发现是因为ios::sync_with_stdio(false)和scanf混用后出现的问题。 原代码如下: #include <iostream> #include <vector> #include <string> #include <map> using namespace std; ve
  • ios::sync_with_stdio(false)有什么作用

    千次阅读 2020-07-14 21:43:50
    ios::sync_with_stdio(false)有什么作用 因为系统默认standard stream应该都是同步的,设置sync_with_stdio(false),其实应该是让C风格的stream和C++风格的stream变成async且分用不同buffer。 注意: 1. ios::sync...
  • int main() { ios::sync_with_stdio(false); int k; cin >> k; //如果k=0则输出包含0个合法括号对的非空括号字符串 if (k == 0) { cout )"; return 0; } //k开根号先生成一些括号对 int t = (int) sqrt(k); //实际...
  • 代码编译运行环境:Win10 x64 + CodeBlocks 17.12 参考文章 1.C++ cin 详细用法 2.C++cin详解及清空输入缓冲...首先,上结论:如果要关闭同步流ios::sync_with_stdio(false)来提高cin输入速度,就不能与getchar()混用
  • 而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是iostream。 决定C++标准streams(cin,cout,cerr…)是否...
  • 所以一般会用ios::sync_with_stdio(false)来取消cin与stdin的同步,从而使cin达到和scanf相差无几的输入效率。 但是,有时候不注意,往往容易把ios::sync_with_stdio和scanf,printf混用,其实这样是有风险的(可能...
  • 在C++中有两种输入输出语句,分别是scanf,printf和cin,cout两种。... 但是 ios::sync_with_stdio(false); 这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几。
  • 文章目录问题解释参考资料 问题 见输入输出编程题:计算一系列数的和 有篇答案如下: #include <string> #include <iostream> #include <vector>... ios_base::sync_with_stdio(false)
  • ios::sync_with_stdio(false)详解

    万次阅读 2018-08-08 17:33:26
    只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。程序如下: const int MAXN = 10000000; int numbers[MAXN]; void cin_read_nosync() { freopen("data.txt","r",stdin); std::...
  • 解析static auto x=[]{ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); return 0; 我在刷牛客网的题时,遇到了运行速度太大,查看了已提交的代码,发现都有一段代码,就是题目中的,查阅了大家的博客,...
  • 今天做HNCPC2015重现赛,... ios::sync_with_stdio(false); cin.tie(nullptr); int Case=0; while(cin >> n >> m >> r1 >> c1 >> r2 >> c2) { for(int i=1; i<=n; i+...
  • ios::sync_with_stdio(false); cin.tie(0); 因为cin会先把要输出的东西存入缓冲区,再输出,导致效率降低 而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间 然而在今天敲题时我发现我的输入的一些...
  • std::ios::sync_with_stdio(false); 这是由于cin比scanf要慢很多,在需要大量读入时,用此行代码可以使cin更快。 为什么cin比scanf更慢呢? 标准 C++ 流与标准 C 流在每次输入/输出操作后同步,同步的 C++ 流为无...
  • cin和cout用起来很方便,但是性能不及scanf和printf,我们可以使用 std::ios::sync_with_stdio(false); 来提升cin和cout的性能与sanf和printf相当
  • std::ios::sync_with_stdio(false)提高效率 在c++中之所以cin,cout效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消`iostream`的输入和输出缓存,可节省时间,使效率与scanf...
  • ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); sync_with_stdio 这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起...
  • c++中cin,cout效率比较低,是因为先把要输出的东西存入缓冲区与C语言中的stdio同步后,再输出,导致效率降低,而这段语句的作用是取消缓冲区同步,直接使用,由此可节省时间,使效率与scanf与printf相差无几。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,254
精华内容 42,501
关键字:

ios::sync_with_stdio(false);