为什么以下代码段会加快代码速度?

时间:2018-01-21 14:41:34

标签: c++ c++11 lambda

我正在解决LeetCode上的Search Insert Position问题。以下代码运行所有测试用例大约需要9毫秒。

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int lo = 0, hi = nums.size() - 1;
        while (lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            if (target < nums[mid]) {
                hi = mid - 1;
            } else if (target > nums[mid]){
                lo = mid + 1;
            } else {
                return mid;
            }
        }
        return lo;
    }
};

当我查看其他人的最佳答案时,我发现了一个奇怪的代码段。当我将代码段复制粘贴到我的答案中时,上面相同的代码只需要4毫秒,这比其他解决方案的近99%快。任何人都可以解释加快速度吗?摘录如下:

#include <vector>
#include <iostream>
using namespace std;

static vector<int> nums=[](){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return vector<int>{};
}();

1 个答案:

答案 0 :(得分:13)

这个片段旨在提高性能&#34;但是要付出代价。我将解释:

std::ios::sync_with_stdio(false);

这会禁用C和C ++标准流的同步。默认情况下,它们会同步以允许混合C和C ++ I / O流(例如cout和printf可以在C ++文件中编写)。

cin.tie(NULL);

这解开了来自cout的cin。同样,默认情况下,它们与cout之前的cout相关联(即输入前输出刷新),因此您可以制作以下示例:

cout << "Number: ";
cin >> number;

当你解开它们时,你可能会在输出(cout)刷新之前得到输入(cin)。

这些几行有助于使代码运行更快,但代价是之前解释的。所以要谨慎使用。

参考文献:https://www.geeksforgeeks.org/fast-io-for-competitive-programming