0

私は迷路を生成し、ブレッドファースト検索を使用して迷路内の道を見つけるプログラムを作成しています。コンテナクラスに要素が存在するかどうかを確認する私の関数は、次のようにベクトルを使用するようになりました(ここで、coordinatePath はベクトルの typedef です)。

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

要素が存在しない場合、このメソッドはコンテナ全体をトラバースする必要があるため、大規模な検索には非常に効果的ではありません。ベクトルの代わりにセットを使用する同じ関数を実装しようとして、次のように記述しました。

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

再準拠しようとすると、最上位の場所で多くのエラーが発生します

エラー 22 エラー C2676: バイナリ '<' : 'const Coordinate' は、この演算子または事前定義された演算子 c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstddef 193 に受け入れられる型への変換を定義していません

私はこれらの特定のデバッグ メッセージをよく理解していません。この高速な検索を実装する方法があるかどうか疑問に思っています。

4

2 に答える 2

2

オブジェクトのを作成するstd::setには、それらのオブジェクトで を定義する必要がありますoperator <

したがって、次の演算子を追加する必要があります。

inline bool operator < (const Coordinate& first, const Coordinate& other);
于 2012-05-07T12:29:12.917 に答える
1

で要素を使用するsetvalue_typeは、定義するoperator<必要があるか、コンテナーに比較ファンクターを提供する必要があります。どうやら、あなたのCoordinate型はそれをしないか、operator<あなたが提供する は互換性のない引数を取ります。おおよそ次のようになります。

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;
于 2012-05-07T12:29:11.100 に答える