Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在自定义比较器时出现空指针错误_C++_C++11_Lambda_Comparator - Fatal编程技术网

C++ 为什么在自定义比较器时出现空指针错误

C++ 为什么在自定义比较器时出现空指针错误,c++,c++11,lambda,comparator,C++,C++11,Lambda,Comparator,我试图在Leetcode上解决这个问题: 给定一组间隔,合并所有重叠的间隔 例1: Input:interval=[[1,3]、[2,6]、[8,10]、[15,18]] 输出:[[1,6],[8,10],[15,18]] 说明:由于区间[1,3]和[2,6]重叠,因此将它们合并为[1,6]。 例2: Input:interval=[[1,4],[4,5]] 输出:[[1,5]] 说明:区间[1,4]和[4,5]被视为重叠。 注:输入类型已于2019年4月15日更改。请重置为默认代码定义以获

我试图在Leetcode上解决这个问题:

给定一组间隔,合并所有重叠的间隔

例1:

Input:interval=[[1,3]、[2,6]、[8,10]、[15,18]]
输出:[[1,6],[8,10],[15,18]]
说明:由于区间[1,3]和[2,6]重叠,因此将它们合并为[1,6]。
例2:

Input:interval=[[1,4],[4,5]]
输出:[[1,5]]
说明:区间[1,4]和[4,5]被视为重叠。
注:输入类型已于2019年4月15日更改。请重置为默认代码定义以获取新方法签名

限制条件:

intervals[i][0] <= intervals[i][1]
但如果我改变比较器如下:

std::sort(intervals.begin(), intervals.end(), [](const vector<int> e1, const vector<int> e2) {
    if (e1[0] == e2[0]) {
        return e1[1] < e2[1];    // change <= into <
    }
    return e1[0] < e2[0];
});
排序(interval.begin(),interval.end(),[](常量向量e1,常量向量e2){ if(e1[0]==e2[0]){
返回e1[1]
return e1[1] <= e2[1];
return e1[1] < e2[1];
然后比较
e1
e2
将返回
true
,无论比较顺序如何

违反
std::sort
的此要求会调用未定义的行为。在这种情况下,UB消毒剂已为您诊断出问题

另一方面,这种比较:

return e1[1] <= e2[1];
return e1[1] < e2[1];
返回e1[1]
非常好,因为它根据需要建立严格的弱排序。

  • 看起来不错!快到了

  • 我们将执行常规的
    std::sort()
    ,然后使用
    std::min()
    std::max()
    ,实际上不必使用比较器:

根据客户的建议进行编辑:
包含两个连续下划线(优化)和 以下划线开头,后跟大写字母的名称为 保留供实现使用。不要在代码中使用它们


很好。很好的一个~~包含两个连续下划线的名称(
\uuuuuuuuuuuuuuuuuuuuuuu
)以下划线开头,后跟大写字母的名称保留供实现使用。不要在代码中使用它们。@Yves确实,所有的清理程序都是运行时诊断工具。在编译时,这些工具称为静态分析器。
return e1[1] < e2[1];
// Most of headers are already included;
// Can be removed;
#include <iostream>
#include <cstdint>
#include <vector>

// The following block might slightly improve the execution time;
// Can be removed;
static const auto improve_runtime = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();



struct Solution {
    static const std::vector<std::vector<int>> merge(
            std::vector<std::vector<int>>& intervals
    ) {
        std::sort(std::begin(intervals), std::end(intervals));
        std::vector<std::vector<int>> merged;

        if (std::size(intervals) >= 1) {
            merged.emplace_back(intervals[0]);
        }

        for (std::size_t index = 0; index < std::size(intervals); ++index) {
            const std::vector<int> interval = intervals[index];
            const std::vector<int> tail = merged.back();

            if (tail[1] >= interval[0]) {
                merged.pop_back();
                merged.emplace_back(std::vector<int> {
                    std::min(tail[0], interval[0]),
                    std::max(interval[1], tail[1])
                });

            } else {
                merged.emplace_back(interval);
            }
        }

        return merged;
    }

};


// int main() {
//     std::vector<std::vector<int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
//     std::vector<std::vector<int>> merged = Solution().merge(intervals);

//     for (auto& interval : merged) {
//         std::cout << "[" << interval[0] << "\t" << interval[1] << "]\n";
//     }
// }

// Most of headers are already included;
// Can be removed;
#include <iostream>
#include <cstdint>
#include <vector>

// The following block might slightly improve the execution time;
// Can be removed;
static const auto improve_runtime = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();


struct Solution {
    std::vector<std::vector<int>> merge(
                                   std::vector<std::vector<int>>& intervals
    ) {
        std::vector<std::vector<int>> res;

        if (intervals.empty()) {
            return res;
        }

        std::sort(intervals.begin(), intervals.end());

        res.push_back(intervals[0]);

        for (std::size_t i = 1; i < intervals.size(); i++) {
            if (res.back()[1] >= intervals[i][0]) {
                if (res.back()[1] <= intervals[i][1]) {
                    res.back()[1] = intervals[i][1];
                }

            } else {
                res.push_back(intervals[i]);
            }

        }

        return res;
    }

};


int main() {
    std::vector<std::vector<int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
    std::vector<std::vector<int>> merged = Solution().merge(intervals);

    for (auto& interval : merged) {
        std::cout << "[" << interval[0] << "\t" << interval[1] << "]\n";
    }
}