隐藏小宇宙的快递包裹 2024-04-26 15:01 采纳率: 100%
浏览 17
已结题

C++自定义比较函数参数顺序问题

auto left = lower_bound(intervals.begin(),intervals.end(),newInterval[0],[](auto& a, int b) { return a[1] < b; });
auto right = upper_bound(left,intervals.end(),newInterval[1],[](int b,auto& a) { return a[0] > b; });

为什么这里交换匿名函数的参数定义顺序就会报错?
例如auto right = upper_bound(left,intervals.end(),newInterval[1],[](auto& a,int b) { return a[0] > b; });这样就是错的。
upper_bound和lower_bound的比较函数原型不都是compare么?

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-04-26 15:01
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题的目的是解决C++标准库中的lower_boundupper_bound函数在使用自定义比较函数时参数顺序的问题。

    问题出现原因

    在C++中,lower_boundupper_bound函数的比较函数参数顺序是根据它们各自的行为来确定的。lower_bound需要找到一个元素,使得所有在这个位置之前的元素都满足比较函数返回true,而upper_bound则相反,它需要找到一个元素,使得所有在这个位置之后的元素都不满足比较函数返回true

    在提供的代码中,lower_bound的比较函数[](auto& a, int b) { return a[1] < b; }正确地定义了a[1](区间的结束时间)应该小于b(新区间的开始时间)。而upper_bound的比较函数[](int b, auto& a) { return a[0] > b; }则正确地定义了a[0](区间的开始时间)应该大于b(新区间的结束时间)。

    如果交换了参数顺序,比如在upper_bound中使用[](auto& a, int b) { return a[0] > b; },那么比较函数的逻辑将不再正确,因为upper_bound需要找到所有结束时间大于b的位置,而不是开始时间。

    问题解决方案

    保持比较函数中参数的顺序不变,以确保lower_boundupper_bound的行为符合预期。

    提供代码

    以下是修改后的代码,它保持了原始代码中的比较函数参数顺序:

    #include <algorithm>
    #include <vector>
    
    // 假设intervals和newInterval已经被正确定义和初始化
    std::vector<std::vector<int>>& intervals;
    int newInterval[2];
    
    auto left = std::lower_bound(intervals.begin(), intervals.end(), newInterval[0],
        [](auto& a, int b) { return a[1] < b; });
    
    auto right = std::upper_bound(left, intervals.end(), newInterval[1],
        [](int b, auto& a) { return a[0] > b; });
    

    代码运行方式

    这段代码需要在一个支持C++11或更高版本的编译器中运行,因为它使用了基于范围的for循环和自动类型推断。你还需要定义intervalsnewInterval,然后编译并运行程序。

    代码预期运行结果

    代码将找到intervals中第一个结束时间大于或等于newInterval[0]的位置(left),以及第一个开始时间大于newInterval[1]的位置(right)。这通常用于确定新的时间间隔应该插入到有序的时间间隔列表中的哪个位置。

    推荐相关链接

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月4日
  • 已采纳回答 4月26日
  • 创建了问题 4月26日