今天在写leetcode上的Maximal Rectangle这一道题时,我发现一个人的8ms解答跟我的16ms解答方法是一样的,复杂度也是一样的,但是为啥他比我快了一倍呢?
我仔细查看他的代码,发现了这么一段:
static int x = []() {
ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
这段代码利用了lambda表达式,在全局作用域定义并且立即执行。
执行的也就两句代码:
ios::sync_with_stdio(false)
表示关闭std::cin
和std::cout
与scanf
和printf
的同步,这是什么意思呢?
sync_with_stdio
这个函数是一个是否兼容stdio的开关,是C++为了兼容C,保证程序在使用了std::printf
和std::cout
的时候不发生混乱,将输出流绑到了一起。
这种兼容会影响C++的IO效率,是一种保守措施。- 至于
cin.tie(NULL)
这句代码,表示解除cin
与cout
之间的绑定,因为在默认情况下cin
绑定的是cout
,这样在每次执行<<
操作符的时候都要调用flush,会增加IO负担。解除这个绑定后可以解除大量flush调用,进一步提高IO效率。
而leetcode网站的测试案例也是通过IO来读取的,因此提高IO效率当然也会给我们的submission提速了。
但我们还是得努力思考出更高效的算法,不然就算给IO提速了也还是给人家吊打了。