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

クラスに を実装する必要がありoperator <ますR3Pointbinary_search()関数は、この演算子を使用して、ターゲット アイテムを検索する方法を決定します。

于 2010-02-28T01:32:13.857 に答える
3

std::binary_search述語関数を使用してエントリを比較します。これoperator <はデフォルトであるため、この op を にオーバーロードする必要がありますR3Point

入力範囲がstd::binary_search正しく機能するためには、この op によって順序付けされなければならないことに注意してください (まあ、それは二分探索の性質です)。

http://www.sgi.com/tech/stl/binary_search.htmlを参照してください。

于 2010-02-28T01:32:22.513 に答える
3

二分探索を使用するには、項目が比較可能でなければなりません。R3Point組み込みの比較がありません。それが主な理由です。

さらに、binary_searchリストを使用するには、比較操作に関してすでにソートされている必要があります。

于 2010-02-28T01:31:43.123 に答える
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)等しいかどうかを返し、falseそうでない場合に返します。

于 2010-02-28T02:27:48.360 に答える