c++ - 为什么以下代码片段会加速代码?

标签 c++ c++11 lambda

<分区>

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

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>{};
}();

最佳答案

制作此代码段是为了“提高性能”,但需要付费。我会解释:

std::ios::sync_with_stdio(false);

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

cin.tie(NULL);

这将 cin 从 cout 解开。同样,默认情况下,它们被绑定(bind)以使 cout 出现在 cin 之前(即输出在输入之前刷新),因此您可以进行以下操作:

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

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

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

引用文献:https://www.geeksforgeeks.org/fast-io-for-competitive-programming

关于c++ - 为什么以下代码片段会加速代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48367983/

相关文章:

c++ - 模板构造函数意外触发移动构造函数(std::function 和 mini case)

c++ - 为什么可以使用 [=] 来修改 lambda 中的成员变量?

java - 创建一个 ImmutableMap<P,ImmutableMultimap<C,V>> 流收集器

c# - 按数据库中的原始数据分组

c++ - 在 C++ 预处理器中为参数添加引号

c++ - 放置在游戏对象定义中的什么位置?

c++ - 如何在良好的 C++ API 中正确使用 shared_ptr

C++11 如何在编译时识别原子类型(通过 mtl 或定义)?

c++ - 什么是非 POD 对象的 xvalue 和 prvalue 之间允许的使用或行为差异的示例?

c++ - 分配指针时出现段错误