记leetcode中提高运行速度的奇技淫巧与其计时不准确性
在看leetcode中别人的代码时,发现了一段奇怪的东西:
static auto x = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
return 0;
}();
这是什么玩意儿?
里面sync那句是解除cin与stdin的同步,加快读入数据的。tie(0)那句是解除cin与cout的绑定,避免每个<<都要flush。
至于x,大括号那句是一个lambda函数,所以x实质上是一个返回值为int的函数。后面跟的括号代表了这个函数是直接执行的。造成的效果就是这几句代码会先于main函数执行,可以在答案函数之外对输入输出流生效。
不过轮子哥说这样做可能会影响stl的初始化。至于用不用就见仁见智啦。
至于leetcode的计时,就相当不准确了。例如题852. 山脉数组的峰顶索引,我的代码如下:
static auto x = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
return 0;
}();
class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
auto high=max_element(A.begin(),A.end());
return high-A.begin();
}
};
同样的代码,运行时间由4mm到28mm,从战胜了100%的人到战胜了5%的人。可能是测试用例少的情况下会这样吧,数据量大起来可能不同算法、写法区分度会高些。
参考
https://www.zhihu.com/question/282092403
http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html