记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

你可能感兴趣的:(C-C++)