【问题标题】:reference binding to null pointer of type 'value_type' when sorting排序时引用绑定到“value_type”类型的空指针
【发布时间】:2019-11-10 00:23:27
【问题描述】:

问题来自meeting rooms,它询问您确定任何(开始时间、结束时间)对之间是否存在冲突

我编写了一个 lambda 函数来根据向量的第一个元素对其进行排序。

    bool canAttendMeetings(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(),
             [](vector<int> a, vector<int>b) {
                 return a[0] - b[0];
             });
        for(int i = 1; i < intervals.size(); i++) {
            if(intervals[i][0] < intervals[i - 1][1])   return false;
        }
        return true;
    }

错误

运行时错误:引用绑定到“value_type”类型的空指针 (stl_vector.h)


我注意到错误是由a[0] - b[0] 引起的。
如果我将其更改为a[0] &lt; b[0],问题就解决了。
这里发生了什么?


导致错误的输入是


[[64738,614406],[211748,780229],[208641,307338],[499908,869489],
[218907,889449],[177201,481150],[123679,384415],[120440,404695],
[191810,491295],[800783,826206],[165175,221995],[420412,799259],
[484168,617671],[746410,886281],[765198,792311],[493853,971285],
[194579,313372],[119757,766274],[101315,917883],[557309,599256],
[167729,723580],[731216,988021],[225883,752657],[588461,854166],
[231328,285640],[772811,869625],[892212,973218],[143535,306402],
[336799,998119],[65892,767719],[380440,518918],[321447,558462],
[54489,234291],[43934,44986],[11260,968186],[248987,707178],
[355162,798511],[661962,781083],[149228,412762],[71084,953153],
[44890,655659],[708781,956341],[251847,707658],[650743,932826],
[561965,814428],[697026,932724],[583473,919161],[463638,951519],
[769086,785893],[17912,923570],[423089,653531],[317269,395886],
[412117,701471],[465312,520002],[168739,770178],[624091,814316],
[143729,249836],[699196,879379],[585322,989087],[501009,949840],
[424092,580498],[282845,345477],[453883,926476],[392148,878695],
[471772,771547],[339375,590100],[110499,619323],[8713,291093],
[268241,283247],[160815,621452],[168922,810532],[355051,377247],
[10461,488835],[220598,261326],[403537,438947],[221492,640708],
[114702,926457],[166567,477230],[856127,882961],[218411,256327],
[184364,909088],[130802,828793],[312028,811716],[294638,839683],
[269329,343517],[167968,391811],[25351,369583],[210660,454598],
[166834,576380],[296440,873280],[660142,822072],[33441,778393],
[456500,955635],[59220,954158],[306295,429913],[110402,448322],
[44523,88192],[231386,353197],[120940,902781],[348758,597599],
[329467,664450],[208411,890114],[230238,516885],[434113,602358],
[349759,419831],[10689,308144],[94526,180723],[435280,986655],
[611999,690154],[75208,395348],[403243,489260],[498884,611075],
[487209,863242],[13900,873774],[656706,782943],[53478,586952],
[226216,723114],[554799,922759],[467777,689913],[80630,147482],
[277803,506346],[532240,976029],[206622,761192],[148277,985819],
[10879,807349],[952227,971268],[172074,919866],[239230,384499],
[607687,984661],[4405,264532],[41071,437502],[432603,661142],
[144398,907360],[139605,360037],[943191,997317],[12894,171584],
[382477,800157],[452077,518175],[208007,398880],[375250,489928],
[384503,726837],[278181,628759],[114470,635575],[382297,733713],
[156559,874172],[507016,815520],[164461,532215],[17332,536971],
[418721,911117],[11497,14032]]

【问题讨论】:

  • 我想一个附加问题是为什么它仍然能够通过 66/77 测试。为什么一开始没有弹出错误?
  • 不相关,但为什么你有一个向量的向量?将一对值表示为 std::vector 很少有意义。
  • @n.m.我不知道。 Leetcode 使用它。
  • Leetcode,说得客气一点,不是高质量编码的缩影。
  • @n.m.我的意思是 Leetcode 将函数签名定义为向量的向量,所以如果我将其更改为其他类型。该函数不会运行。

标签: c++ algorithm


【解决方案1】:

sort 的比较器应该返回一个布尔值(即真或假)。因此,您的情况应该是:

a[0] < b[0]

【讨论】:

  • 哦,我明白了。所以这就是问题所在!
  • 我认为这是与功能的比较。非常感谢!
  • 但是为什么它仍然能够通过 66/77 测试呢?为什么一开始没有弹出错误?
  • @Nat 因为a[0] - b[0]的结果是一个整数,可以根据该数字是零还是非零转换成布尔值。此外,std::sort 要求您的比较函数遵循strict-weak ordering。由于您的函数没有,这将导致调用未定义的行为。当你的程序调用未定义的行为时,编译器不需要给你一个错误或警告或任何东西。
  • 我明白了。感谢您的解释:p
猜你喜欢
  • 2020-01-03
  • 1970-01-01
  • 2022-06-03
  • 2019-11-17
  • 1970-01-01
  • 2022-08-20
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多