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

eli*_*inx 6 c++ lambda c++11

我在LeetCode上解决了搜索插入位置问题.以下代码运行所有测试用例大约需要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;
    }
};
Run Code Online (Sandbox Code Playgroud)

当我查看其他人的最佳答案时,我发现了一个奇怪的代码片段.当我将代码段复制粘贴到我的答案中时,上面相同的代码只需要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>{};
}();
Run Code Online (Sandbox Code Playgroud)

Abd*_*lah 13

该片段旨在"提高性能",但需要付出代价.我会解释一下:

std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)

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

cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)

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

cout << "Number: ";
cin >> number;
Run Code Online (Sandbox Code Playgroud)

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

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

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