4

我有以下代码行:

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;

谢谢。

4

5 回答 5

3

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

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

于 2010-02-28T01:31:43.123 回答
3

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

于 2010-02-28T01:32:13.857 回答
3

std::binary_search使用谓词函数来比较条目。这是operator <默认设置,因此您需要为R3Point.

请记住,输入范围必须按此操作进行排序std::binary_search才能正常工作(嗯,这是二进制搜索的本质)。

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

于 2010-02-28T01:32:22.513 回答
2

为了使用binary_search你输入的序列必须按照一定的比较谓词进行排序。稍后,必须(显式或隐式)给出相同的比较谓词以binary_search在搜索期间使用。

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

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

一旦你知道了比较谓词和传递方法,你就可以对binary_search.

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

于 2010-02-28T01:44:47.823 回答
0

如果 R3Point 是您实现的,那么您可以operator<为它添加。

否则,您必须实现一个比较函子,并将其分配给binary_search.

记住以下标记

返回true范围内的元素[first,last)是否等于value,false否则返回。

于 2010-02-28T02:27:48.360 回答