binary_search in c ++意外行为

时间:2013-07-11 21:05:31

标签: c++ stl

以下代码片段正在回复我0.我预计它会是1.这里发生了什么问题?

#include <iostream>
#include <iterator>
#include <ostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
  vector<int> v;
  int arr[] = {10,20,30,40,50};
  v.push_back(11);
  v.push_back(22);
  copy(arr,arr + sizeof(arr)/sizeof(arr[0]),back_inserter(v));  // back_inserter makes space starting from the end of vector v
  for(auto i = v.begin(); i != v.end(); ++i){
    cout << *i << endl;
  }
  cout << endl << "Binary Search -  "  << binary_search(v.begin(), v.end(), 10) <<endl; // returns bool 
}

我正在使用gcc /usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper

4 个答案:

答案 0 :(得分:12)

我运行程序并看到了这个:

11
22
10
20
30
40
50

Binary Search -  0

您的数组未排序,因此二进制搜索失败。 (它在第一个位置看到11,并且此处不存在10的结论)

您要么确保在二进制搜索之前对数组进行排序,要么使用常规std::find

答案 1 :(得分:4)

binary_search说:

  

检查排序范围[first, last)是否包含等于的元素   value。第一个版本使用operator<来比较元素   第二个版本使用给定的比较函数comp

您的列表未排序,它包含11之前的元素2210

答案 2 :(得分:4)

您的数组未排序,因此binary_search未定义行为。请尝试使用std::find

bool found = std::find(v.begin(), v.end(), 10) != v.end()

§25.4.3.4C ++ 11标准(3242草案)

  
      
  1. 要求:[first,last]的元素e相对于表达式e&lt;值和!(值&lt; e)或comp(e,   value)和!comp(value,e)。此外,对于[first,last]的所有元素e,   e&lt;值暗示!(值&lt; e)或comp(e,value)暗示!comp(value,   e)所示。
  2.   

答案 3 :(得分:4)

“意外行为”?这里没什么意外的。

二进制搜索算法的整体思想是利用输入数组排序这一事实。如果数组未排序,则不能对其进行任何二进制搜索。

当您使用std::binary_search(以及所有其他基于标准二进制搜索的算法)时,输入序列必须按照与std::binary_search使用的相同的比较谓词进行排序。由于您未将任何自定义谓词传递给std::binary_search,因此它将使用<运算符定义的排序。这意味着您的输入整数序列必须按升序排序。

在您的情况下,输入序列不满足该要求。 std::binary_search无法在其上使用。