2011-08-12 15 views
0

これはおそらく非常に単純ですが、どこでも解決策を見つけることはできません。これはC++の質問です。 基本的には、いくつかのインスタンスを持つクラスがあります。このクラスのすべてのインスタンスで変数を自動的にチェックしたいと思います。私は手動で各インスタンスをチェックすることはできません。インスタンスが数百あるからです。誰でもこれを行う方法を知っていますか?明確にするために、ここで私が実装しようとしている正確な使用方法は、クラスの各インスタンスの変数の比較 - C++

です: 私は他の人の間での特性Xを持ち、Y.、プレイヤーはまた、私は必要な特性XとY を持って ルームと呼ばれるクラスを、持っています部屋の各インスタンスをソートし、プレイヤーが一致するものがあればそれを見つけ出し、そのオブジェクトからデータを引き出す。

乾杯!

+0

インスタンスはどこに保存されていますか? –

+1

部屋を2次元のテーブルに保存できますか?プレーヤーの位置を考えれば、すぐに部屋を見つけることができます。部屋の形状が長方形でない場合は、各部屋を複数の長方形のセルに細分することによっても可能です。 – Jem

答えて

1

最初の方法は、部屋のすべてをベクトルに置き、ベクトルを繰り返し検索して一致するものを検索することです。 (つまり、x、y座標を返し、プレーヤーの位置と比較する.location()メソッドを持つ)。

この線形検索は遅くなる可能性があります。具体的には、空間検索に使用されるkd-tree構造のようなものを使用します。

かなり良い標準ライブラリのような、ヘッダーベースのKDツリーコンテナ(私はかなり使ってきた、とかなり良い発見したことを)ここにあります:libkdtree++

1

あなたはすべてを置くことができstd :: map内のルームクラス。キーはstd :: pair(またはXとYの型)になります。次に、ベクトルソリューションよりもはるかに優れたパフォーマンスが得られます。

+1

+1は効率的でシンプルな解決策になるでしょう。しかし、ここでの制限は、プレイヤーが部屋を識別する特定のx、y位置に必ずしも存在しない場合です(部屋の重心をx、yの位置として使用しているとします。したがって、正確なx、y点ではなく、最も近い重心のために探索が行われなければならない。 – MarkD

0

プロパティX、Yは、あまりにも「不良」でないなら、あなたは特定の部屋

0

にプロパティX、YをマッピングすることができますあなたはRoomのすべてのインスタンスを格納しているどのように言及していません。 std::vector(または反復処理できる別のコンテナ)の中にroomsという名前があるとします。 find_ifを使用してインスタンスを見つけることができます。あなたはブーストを使用している場合はラムダをサポートし、またはコンパイラを使用している場合

struct Finder 
{ 
    Finder(int x, int y) : x_(x), y_(y) {} 

    bool operator()(const Room& room) 
    { 
    return (room.getX() == x_) && (room.getY() == y_); 
    } 
private: 
    int x_; 
    int y_; 
}; 

Finder finder(10, 20); // these are the coordinates you're looking for 

std::vector<Room>::const_iterator it = find_if(rooms.begin(), rooms.end(), finder); 

、あなたはFinder構造を取り除くとラムダに置き換えることができます。

0

パフォーマンスに問題がある場合は、kd-tree、quadtree、octreeなどの空間データ構造を探してください。

関連する問題