谈谈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中所有值都大于key reesult是begin迭代器,且begin与end不相同
指定的key 不存在,且set中所有值都小于key reesult是end迭代器,且begin与end不相同
指定的key 不存在,且set中有的值大于key,有的小于key reesult指向第一个大于它的元素的迭代器,且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. 谈谈 MySQL 索引

    2024-05-14 11:04:13       34 阅读
  2. 谈谈 HTTP 方法

    2024-05-14 11:04:13       32 阅读
  3. 谈谈mybatis理解(一)

    2024-05-14 11:04:13       53 阅读
  4. 谈谈mybatis理解(三)

    2024-05-14 11:04:13       51 阅读
  5. 谈谈Pytorch中dataset

    2024-05-14 11:04:13       47 阅读
  6. 谈谈对chatgpt看法

    2024-05-14 11:04:13       40 阅读
  7. 谈谈JVM内存区域

    2024-05-14 11:04:13       43 阅读
  8. 谈谈springboot工厂模式

    2024-05-14 11:04:13       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 11:04:13       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 11:04:13       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 11:04:13       87 阅读
  4. Python语言-面向对象

    2024-05-14 11:04:13       96 阅读

热门阅读

  1. Linux-vi/vim

    2024-05-14 11:04:13       29 阅读
  2. CentOS常见的命令

    2024-05-14 11:04:13       32 阅读
  3. 水利行业工程设计资质如何去申请

    2024-05-14 11:04:13       31 阅读
  4. vue预览PDF文件的方法

    2024-05-14 11:04:13       28 阅读
  5. Flink Stream API实践

    2024-05-14 11:04:13       28 阅读
  6. 13.复习1笔记

    2024-05-14 11:04:13       28 阅读
  7. Gitee使用教程

    2024-05-14 11:04:13       32 阅读
  8. VsionPro

    2024-05-14 11:04:13       28 阅读
  9. C语言从头学05——头文件及库文件

    2024-05-14 11:04:13       28 阅读
  10. linux程序分析命令(三)

    2024-05-14 11:04:13       29 阅读
  11. 【设计模式】23种设计模式概览及应用示例

    2024-05-14 11:04:13       26 阅读
  12. 21.JVM的垃圾回收算法

    2024-05-14 11:04:13       30 阅读
  13. elementui中close-on-click-modal=“fasle“不生效

    2024-05-14 11:04:13       28 阅读
  14. CentOS 初始化配置事项

    2024-05-14 11:04:13       21 阅读