2010-02-28 120 views
3

我有下面的代码行:C++:二进制搜索编译错误

if(std::binary_search(face_verts.begin(), face_verts.end(), left_right_vert[0]) && 
     std::binary_search(face_verts.begin(), face_verts.end(), left_right_vert[1])) 

当我编译我的代码,我得到以下错误:

In file included from /usr/include/c++/4.4/algorithm:62, 
       from R3Mesh.cpp:10: 
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘bool std::binary_search(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<R3Point*, std::vector<R3Point, std::allocator<R3Point> > >, _Tp = R3Point]’: 
R3Mesh.cpp:1335: instantiated from here 
/usr/include/c++/4.4/bits/stl_algo.h:2762: error: no match for ‘operator<’ in ‘__val < __i.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = R3Point*, _Container = std::vector<R3Point, std::allocator<R3Point> >]()’ 
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘_FIter std::lower_bound(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<R3Point*, std::vector<R3Point, std::allocator<R3Point> > >, _Tp = R3Point]’: 
/usr/include/c++/4.4/bits/stl_algo.h:2761: instantiated from ‘bool std::binary_search(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<R3Point*, std::vector<R3Point, std::allocator<R3Point> > >, _Tp = R3Point]’ 
R3Mesh.cpp:1335: instantiated from here 
/usr/include/c++/4.4/bits/stl_algo.h:2442: error: no match for ‘operator<’ in ‘__middle.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = R3Point*, _Container = std::vector<R3Point, std::allocator<R3Point> >]() < __val’ 
make: *** [R3Mesh.o] Error 1 

我在开始的时候确实#include <algorithm>的文件,我似乎无法弄清楚错误。以下是函数调用中使用的容器:

vector <R3Point > face_verts; 
vector <R3Point > left_right_vert; 

谢谢。

+0

R3Point类的接口是什么样的? – unknownuser 2010-02-28 01:32:08

+1

哟用什么来排序'face_verts'序列? – AnT 2010-02-28 01:47:49

+0

我实际上没有对我的向量进行排序 - 我不知道我正在运行二分搜索的容器需要排序。有没有办法,我可以找出一个元素是否存在于我的矢量中,也许使用其他函数?否则,我认为实现我自己的“搜索”功能可能会更有效率。 – Myx 2010-02-28 15:51:52

回答

2

为了使用binary_search你输入siquence必须是排序按照一定的比较谓词。之后,必须给出(明示或暗示)这个完全相同的比较谓词,以便在搜索期间使用binary_search

所以,这些问题你应该在这种情况下,回答有以下几种

  1. 是输入序列排序?如果不是,你可以在这里停下来。 binary_search不能与无序序列一起使用。
  2. 如果它被排序,那么使用什么比较谓词对它进行排序呢?它是如何传递给排序功能的?

一旦你知道比较谓词和传球方法,你可以用binary_search做同样的事情。

请注意,比较不一定通过operator <实施,如其他答案可能表明的那样。例如,它可能是一个独立的基于函子的比较谓词。此外,binary_search没有自动提取比较谓词(这与operator <的情况一样)暗示了“独立”方法。

3

为了使用二进制搜索,您的项目必须具有可比性。 R3Point没有内置比较,这是核心原因。

此外,对于使用binary_search您的列表必须是已经排序了比较操作。

3

您需要为您的R3Point类实施operator <binary_search()函数将使用此运算符来确定如何找到目标项目。

3

std::binary_search使用谓词函数比较条目。默认情况下,这是operator <,因此您需要将此操作超载为R3Point

请记住,输入范围必须通过此操作命令std::binary_search才能正常工作(嗯,这就是二进制搜索的本质)。

请参阅http://www.sgi.com/tech/stl/binary_search.html

0

如果R3Point由您执行,那么您可以为其添加operator<

否则,您必须实施比较仿函数,并将其分配给binary_search

记住the following mark

返回true如果在范围[first,last)的元素是等效到值,并false否则。