You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何指定greater排序的std::map调用lower_bound(0)返回end()?

为什么降序std::map调用lower_bound(0)返回end()?

核心问题是你把默认升序下lower_bound的行为直接套用到了降序map上——lower_bound的判断逻辑是和容器的排序规则绑定的,不是固定的"找第一个不小于参数的元素"。

具体拆解

  1. map排序与lower_bound的逻辑绑定
    std::map的排序完全依赖你指定的比较函数:

    • 默认用less<int>时,元素升序排列,此时lower_bound(val)返回第一个key >= val的迭代器(因为less<int>()(val, key)为false等价于val <= key)。
    • 当你用greater<int>时,元素降序排列,lower_bound(val)的逻辑变成:返回第一个迭代器it,使得greater<int>()(val, it->first)为false。而greater<int>()(a,b)就是判断a > b,所以这个条件等价于val <= it->first。
  2. 你的场景问题
    你的map是降序排序,最小key是1(意味着map里的key从大到小排列,比如4、3、2、1,1是最后一个元素)。你预期lower_bound(0)返回key=1的迭代器,是因为你沿用了升序逻辑里"找不小于0的最小元素"的思路,但这和降序map的lower_bound逻辑完全不符。

    实际调用lower_bound(0)时,遍历第一个元素key=4:0 > 4不成立(即greater<int>()(0,4)为false),照理说应该返回指向4的迭代器。但你说返回了mp.end(),大概率是你代码里错误访问了end()的元素——end()是尾后迭代器,不指向任何有效元素,访问它的first和second是未定义行为,你看到的"4 0"是随机的内存垃圾,不是map里的真实元素。

  3. 如何实现你预期的逻辑
    如果你想在降序map里找到不小于0的最小元素(也就是key=1),可以用两种方式:

    • 调用upper_bound(0),然后取前一个迭代器:auto it = prev(mp.upper_bound(0));(因为upper_bound(0)在降序map里返回第一个key < 0的迭代器,这里所有key都>=0,所以返回end(),prev(end())就是最后一个元素key=1)。
    • 直接改用默认less<int>的升序map,这样lower_bound(0)就会返回你预期的key=1的迭代器。

内容的提问来源于stack exchange,提问作者yane lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:58:10