谈谈std::map的lower_bound

我们知道std::map内部是一个红黑树,放到std::map里的数据等有一个能比较大小的方法。它相当于java里面的TreeMap。
它里面有个lower_bound方法,返回一个迭代器,它指向map里第一个大于等于参数的元素。
方法的签名很简单,但是在不同情况下,它的返回值还是有些麻烦的,这里记录一下。

分别指明下面几种case

case结果
set为空reesult 是end迭代器,且begin与end相同
指定的key 存在result是begin迭代器,且begin与end不相同
指定的key 不存在,且set中所有值都大于keyreesult是begin迭代器,且begin与end不相同
指定的key 不存在,且set中所有值都小于keyreesult是end迭代器,且begin与end不相同
指定的key 不存在,且set中有的值大于key,有的小于keyreesult指向第一个大于它的元素的迭代器,且begin与end不相同

测试代码如下:

#include <iostream>
#include <map>

// 假设的类和结构体定义,仅用于演示
struct Extent {

public:
    int end;

    explicit Extent( int n){
        end=n;
    }
    //Extent() : end(0) {}
    int logical_end() const { return end; } // 简化逻辑

};

using extent_map_t = std::map<int, Extent>; // 假定的映射类型

class BlueStore {
public:
    extent_map_t extent_map;
  
    extent_map_t::iterator seek_lextent(int offset) {
        auto fp = extent_map.lower_bound(offset);
        std::cout<<"fp == extent_map.begin :"<< (fp == extent_map.begin()) <<
         " fp == extent_map.end :" <<(fp == extent_map.end())<<std::endl;
        std::cout<<"extent_map.begin() == extent_map.end() "<< (extent_map.begin() == extent_map.end())<<std::endl;
        if (fp != extent_map.begin()) {
            --fp;
            std::cout<< (fp == extent_map.begin()) <<" " <<(fp == extent_map.end())<<std::endl;
            if (fp->second.logical_end() <= offset) {
                ++fp;
            }
        }
        return fp;
    }
};
int main() {


    BlueStore store_empty;
    Extent extent2(5);
    store_empty.extent_map.emplace(20,extent2);
    store_empty.extent_map.emplace(30,extent2);
    auto empty_result = store_empty.seek_lextent(25);
    if (empty_result == store_empty.extent_map.end()) {
        std::cout << "For an empty map, seek_lextent returns end()." << std::endl;
    } else {
        std::cout << "Unexpected behavior for empty map." << std::endl;
    }
        return 0;
}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值