zoukankan      html  css  js  c++  java
  • std::ios::sync_with_stdio和tie()——给cin加速

    平时在Leetcode上刷题的时候,总能看到有一些题中最快的代码都有这样一段

     

    static const auto init = []() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
        return nullptr;
    }();

    有时候明明算法是一样的,但是速度要比没有这段代码的快很多;

    查了一下这段代码其实是给cin加速的,也就是说上面提到的题应该是碰到的大数据的输入,而cin cout要比scanf  printf慢很多,很容易就time error了;

    这应该也是一些acm dalao用printf scanf而不用cincout的原因吧;

     

    具体是:

    1. C++为了让cin cout和scanf printf 同时使用时不产生混乱,所以c++用一个缓冲区来同步c的标准流,
      而std::ios::sync_with_stdio(false)可以关闭这一个同步,让cin和cout不经过缓冲区;
    2. tie()函数是把两个stream绑定到一起,flush()是把缓冲区的数据输出到文件,而cin和cout是默认绑定在一起的,
      每次使用都会调用flush(), 而cin.tie(nullptr)可以解除这个绑定;
    3. cin和cout默认绑定在一起,是为了防止cin出现在cout之前,在绑定后,
      每次cin都会先把缓冲区的数据刷新到输出文件中

     

     

     

     

     

     

     

     

     

     

    今天也碰到了一个大数据输入的题:

     

     

    嘛,其实这里主要是算法的问题;

     

    改进之后,这里还没用上述的代码:

     

     

    使用之后:

     

    还是有效果的;

  • 相关阅读:
    拦截器-监听器-过滤器的区别
    实例Rest风格+SpringMVC+中文乱码解决
    Nginx功能详细介绍(大而全)
    Nginx应⽤场景之反向代理
    SpringMVC参数传递之日期类型
    SpringMVC请求参数绑定回顾
    数据输出机制之Model、Map及ModelMap回顾
    ReactHook快速上车
    Chrome性能调优技巧
    移动端适配的最佳实践
  • 原文地址:https://www.cnblogs.com/mckc/p/9886378.html
Copyright © 2011-2022 走看看