二进制搜索 C++ STL

Posted

技术标签:

【中文标题】二进制搜索 C++ STL【英文标题】:Binary Search C++ STL 【发布时间】:2010-11-26 09:33:36 【问题描述】:

我有一个 unordered_map 向量,它是根据我定义的比较器函数排序的。我也想使用二进制搜索来查找使用比较器函数的值之一。但是,二进制搜索只返回 bool,我需要结果的索引/迭代器。我能做什么?

【问题讨论】:

【参考方案1】:
#include <algorithm>
using namespace std;

//!!!!!   a must be sorted using cmp. Question indicates that it is.        
it = lower_bound(a.begin, a.end(), value, cmp);

//Check that we have actually found the value. 
//If the requested value is missing
//then we will have the value before where the requested value 
//would be inserted.
if(it == a.end() || !cmp(*it, value))

   //element not found
 
else

   //element found

【讨论】:

lower_bound 似乎比简单的“任何匹配值”要慢得多。假设 1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,6,7。中间是 5 - 寻求价值。但是 lower_bound 会向左走。这是不理想的。我可以假设找到左边界的 O(Log(N)) 解决方案。但它是多余的。我对此感到非常沮丧。但是有一个 C 函数 ::bsearch。 如果it!=a.end()!cmp(*it, value) 始终为真。你应该颠倒这些论点。【参考方案2】:
#include <algorithm>
using namespace std;

it = lower_bound(a.begin, a.end(), value, cmp);

【讨论】:

-1 lower_bound 不一定会返回元素。如果元素丢失,它将在它在向量中之前返回元素。 使用 lower_bound 仍然是明智的。使用迭代器,检查它是否可取消引用。如果是,取消引用它并检查搜索到的元素。如果它是元素,你有它,否则它不在那里。

以上是关于二进制搜索 C++ STL的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里可以获得“有用的”C++ 二分搜索算法?

C++:字符串的二进制搜索部分

STL地图的奇怪输出

STL与模板

如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++

C ++中的线性搜索与二进制搜索实时性能