Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

binary_search

函数模板  <algorithm>
default (1)
template <class ForwardIterator, class T>
  bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>
  bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val, Compare comp);

测试值是否在有序序列中存在

如果范围[first,last)中的任何元素等于val,则返回true,否则返回false。

第一个版本使用操作符<比较元素,第二个版本使用comp操作符比较元素。 如果 (!(a<b) && !(b<a))或如果 (!comp(a,b) && !comp(b,a)),两个元素a和b被认为是等价的。

这个范围内的元素应该已经按照同样的标准排序(操作符<或comp),或者至少根据val进行分区。

该函数通过比较排序范围内的非连续元素来优化比较的次数,这对于随机访问迭代器特别有效。

这个函数模板的行为相当于:
template <class ForwardIterator, class T>
  bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
  first = std::lower_bound(first,last,val);
  return (first!=last && !(val<*first));
}

☲  参数


first, last
指向一个已排序(或正确分区)序列初始和最终位置的前向迭代器。使用的范围是[first,last), 它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

val
该范围中要搜索的值。
对于(1),T是支持与range [first,last)的元素作为operator<的右侧操作数进行比较的类型。

comp
二元函数,接受两个由ForwardIterator指向的类型参数(和T类型), 并返回一个可转换为bool类型的值。返回的值表示第一个参数是否被认为在第二个参数之前。
函数不能修改它的任何参数。
它可以是函数指针,也可以是函数对象。

☉  返回值



如果找到与val等价的元素,则为True,否则为false。

☣  示例



// binary_search example
#include <iostream>     // std::cout
#include <algorithm>    // std::binary_search, std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

int main () {
  int myints[] = {1,2,3,4,5,4,3,2,1};
  std::vector<int> v(myints,myints+9);                         // 1 2 3 4 5 4 3 2 1

  // using default comparison:
  std::sort (v.begin(), v.end());

  std::cout << "looking for a 3... ";
  if (std::binary_search (v.begin(), v.end(), 3))
    std::cout << "found!\n"; else std::cout << "not found.\n";

  // using myfunction as comp:
  std::sort (v.begin(), v.end(), myfunction);

  std::cout << "looking for a 6... ";
  if (std::binary_search (v.begin(), v.end(), 6, myfunction))
    std::cout << "found!\n"; else std::cout << "not found.\n";

  return 0;
}

输出:
looking for a 3... found!
looking for a 6... not found.

✥ 复杂度



平均而言, first and last之间的距离为对数:执行大约log2(N)+2个元素比较(其中N是距离)。
在非随机访问迭代器上,迭代器的前进平均会增加N个额外的线性复杂度。

⇄ 数据竞争


范围[first,last)中的对象将被访问。

☂ 异常安全性



如果元素比较或迭代器操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。

🍄  另请参阅



lower_bound 返回迭代器下界(函数模板)
upper_bound 返回迭代器上界(函数模板)
find 在范围内查找值(函数模板)
equal_range 获取相等元素的子范围的边界(函数模板)

联系我们 免责声明 关于CandCplus 网站地图