我们知道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;
}