C++ 为什么在自定义比较器时出现空指针错误
我试图在Leetcode上解决这个问题: 给定一组间隔,合并所有重叠的间隔 例1: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日更改。请重置为默认代码定义以获
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";
}
}