2012-05-07 10 views
0

私は迷路を生成するプログラムを作っています。そして、迷路の中で道を見つけるために最初の探索をブレンドして使用します。この方法は、要素がある場合、完全なコンテナを横断しなければならないのでセット内のオブジェクトを見つける関数を作るにはどうすればよいですか?

bool Labyrinth::inVisited(const Coordinate &c, const coordinatePath &visited) const 
{ 
    for each (Coordinate coord in visited) 
    { 
     if(coord == c) 
      return true; 
    } 
    return false; 
} 

:要素がコンテナクラスに存在するかどうかを確認する私の機能について(coordinatePathベクトルのtypedefである)このようなベクターを使用しそれが存在しないと、大規模な検索では非常に効果がありません。私は、ベクトルの代わりにセットを使用するのと同じ機能を実装しようとしたと、このようにそれを書いた:

bool Labyrinth::inVisited(const Coordinate &c, const set<Coordinate> &visited) const 
{ 
     return (visited.find(c) != visited.end()); 
} 

私は一番上が

エラー22のエラーである。ここで、iは、エラーの多くを得るrecomplieしようC2676:バイナリ '<': 'const Coordinate'は、この演算子または定義済み演算子c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xstddefに受け入れられる型への変換を定義しません。193

私はこれらの特定のデバッグメッセージを本当に理解していないし、この高速検索を実装する方法があるのだろうかと思っています!

答えて

1

setの要素を使用するにはvalue_typeoperator<を定義するか、コンテナに比較ファンクタを指定する必要があります。どうやら、あなたのCoordinateタイプはそれをしないか、あなたが提供するoperator<は互換性のない引数をとります。それは、おおよそ次のようになります。オブジェクトのstd::setを作成するためには

struct Coordinate { 
    bool operator<(const Coordinate& other) const { return false; } 
}; 

// or by providing a functor 
struct CmpCoord { 
    bool operator()(const Coordinate& x, const Coordinate& y); 
}; 
typedef std::set<Coordinate, CmpCoord> coord_set; 
+0

@MSaltersが自由 'オペレータの何が問題でしたか<'? – pmr

+0

すばやく対応いただきありがとうございます! – Mattias

+0

@pmr: '座標(0,0)<(0,0)座標'厳格な弱い発注要件に違反している、 'true'をしました。一般に、すべての座標は自分自身でさえも同じではありませんでした。私はすべての座標が等しくなるように変更しました。これは有効です。 – MSalters

2

、これらのオブジェクトはoperator <を定義する必要があります。

だからあなたは、以下の演算子を追加する必要があります。

inline bool operator < (const Coordinate& first, const Coordinate& other); 
+1

良い答え。しかし、演算子<()を定義するだけでなく、一貫性をもって実装し、厳密な弱い順序付け**を行わなければならないということは良いことかもしれません。 – ereOn

+0

迅速な対応に感謝します。 – Mattias

関連する問題