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