2009-07-13 8 views
1

2つの引数を受け取り、それを特定の値にマッピングするデータ構造(STLまたはブーストで容易に利用可能)がありますか? 、2引数のマップに似たデータ構造

coordinate_quadrantを(-1、-1)= 3

weight_of(U:

例はグラフのエッジの重みを座標グリッド内の特定の情報を返すか、取得するためであろうv)= 10

象限の例は、4つのif文を持つ単純な関数で行うことができます。私は主に重量の例に合った例を探しています。私は、エッジクラスを作成し、それをweight_of(Edge edge)関数に渡す必要がないようにしようとしています。

答えて

11

std :: map < std :: pair <タイプ1、タイプ2 >、タイプ3 >を使用できます。

0

バックエンドの整数のペアであるオブジェクトを使用します。言い換えれば、マップを実装しますが、このペアオブジェクトに対してです。複数の引数を受け入れるために演算子[]をオーバーライドすることはできませんが、カスタムマップクラスで演算子 ()をオーバーライドすることができます。 my_map[row](col) = whatever

1

私は次の選択肢を検討します:

オプションSTDと1

のstd ::マップ::ペア値としてキーとタイプ3のように<タイプ1、タイプ2>

std::map< std::pair< Type1, Type2 >, Type3 > data; 

オプション2

2次元のstd ::ベクトルグラフまたは直交座標空間モデリングする際のType1とType2のは、あなたが見つけるかもしれないとして、整数である場合には

: のstd ::ベクトル<のstd ::ベクトル<タイプ3を>>データ;

オプションタイプ3にマッピングすることができますタイプ1とタイプ2を含む3

ユーザー定義クラス、

あなたがこれまで以上の値を使用して二つのタイプを飾るしたい場合があります場合は、あなたが可能性あなたのタイプの両方を含むクラスを定義し、第三のタイプにマッピングするのstd ::マップを使用します。

public: 
    MyClass(Type1 x, Type2 y) : x_(x), y_(y) 

    Type1 x() const { 
     return x_; 
    } 

    Type2 y() const { 
     return y_; 
    } 


private: 
    Type1 x_; 
    Type2 y_; 
}; 


std::map< MyClass, Type3 > data; 

オプション1の利点は、それがあるということです本当に速くて簡単にコーディングすることができ、C++を知っている人にとっては意味があるはずです。オプション2はおそらく少し早く、より多くのディメンションを持つように簡単に変更できるという利点があります。オプション2の欠点は、値が2次元ベクトルへの整数インデックスである必要があることです。

私の意見では、オプション3はType1とType2のタイプには要件がなく、読みやすく、非常に合理的な方法でさらに多くのデータを含めることができるため、私にとって最良の選択です。オプション3の欠点は、あなたがお互いにMyClassのオブジェクトを比較するためのStrictWeakOrderingの順序を定義する必要があるということですが、それはかなり簡単です:

bool operator<(const MyClass & rhs) const { 
    return (rhs.x() <= x() && rhs.y() <= y()); 
} 

は、クラスのメンバ関数ことを確認し、あなたが行く準備ができなければなりません。

プログラミングの多くのことと同じように、あなたがやっていることの詳細や投資する時間を考慮するまで、明らかな正しい答えはありません。重要な存在と範囲外のエラーをチェックすることを忘れないでください。 :)

+0

あなたの操作者は<間違っています。 lhs.x rhs.yの場合、lhs MSalters

関連する問題