C ++:二进制搜索编译错误

时间:2010-02-28 01:25:44

标签: c++ binary-search

我有以下几行代码:

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;

感谢。

5 个答案:

答案 0 :(得分:3)

要使用二分搜索,您的商品必须具有可比性。 R3Point没有内置的比较,这是核心原因。

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

答案 1 :(得分:3)

您需要为operator <课程实施R3Pointbinary_search()函数将使用此运算符来确定如何查找目标项。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

为了使用binary_search,你输入的siquence必须按照某个比较谓词进行排序。之后,必须(明确地或隐含地)将这个相同的比较谓词赋予binary_search以在搜索期间使用。

因此,在这种情况下您应该回答的问题如下

  1. 输入序列是否排序?如果不是,你可以在这里停下来。 binary_search不能与无序序列一起使用。
  2. 如果它已排序,那么使用什么比较谓词对其进行排序?它是如何传递给排序函数的?
  3. 了解了比较谓词和传递方法后,您可以对binary_search执行相同的操作。

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

答案 4 :(得分:0)

如果您实施了R3Point,则可以为其添加operator<

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

记住the following mark

  

如果true范围内的元素等效为值,则返回[first,last),否则返回false