如何为pair类型vector的lower_bound编写仅比较首元素的比较器
正确实现方法
首先明确std::lower_bound的比较器规则:比较器接收两个参数,第一个是传入的待查找值,第二个是遍历区间内的元素,返回true表示待查找值的排序位置在当前元素之前,必须遵循严格弱序要求。
针对存储std::pair<std::string, std::string>元素的vector,仅比较首元素的查找实现如下:
bool find(const std::string& key) const { // 前置要求:words_ 已按pair首元素升序排序 auto finder = std::lower_bound( words_.begin(), words_.end(), key, [](const std::string& k, const std::pair<std::string, std::string>& elem) { return k < elem.first; } ); // 校验结果:迭代器不越界,且首元素和key完全匹配 return finder != words_.end() && finder->first == key; }
原代码的错误说明
- 比较器参数类型错误:
lower_bound向比较器第二个参数传入的是vector内的元素实例(即std::pair<std::string, std::string>类型),不是迭代器,原代码写迭代器类型会直接触发编译错误。 - 比较逻辑不符合要求:
lower_bound基于严格小于的弱序规则做二分查找,原代码用!=判断完全不满足排序规则,会导致查找逻辑完全失效。 - 缺少结果校验:
lower_bound返回的是第一个「不满足key < 元素首元素」的位置,这个位置可能是vector末尾,也可能是首元素比key大的位置,必须校验迭代器有效性和元素值匹配,才能确定找到了目标。
注意:使用该查找前必须保证
words_是按pair首元素升序排列的,否则二分查找的结果不可靠。如果vector未排序,需要先按首元素排序,或者直接用std::find_if做线性查找。
内容的提问来源于stack exchange,提问作者jjjjake
相关产品推荐
相关产品推荐

