3

Polygon次のシグネチャを持つ構造と関数があります

Polygon myfunction(Polygon &pol1, Polygon &pol2, int rot1, int rot2); 

ここで、pol1 と pol2 はPolygons、rot1 と rot2 は pol1 と pol2 に適用される回転です。

myfunction一連のポリゴンと一連の許容回転に適用されたすべての結果を保存する必要があります。

たとえば、100 個のポリゴンと 4 つの許容回転がある場合、100*100*4*4 = 160000 個のポリゴンを格納する必要があります。多くのメモリが必要であることは承知していますが、それで問題ありません。

現時点では、次のようなコンテナに保管しています。

vector<vector<vector<vector<Polygon>> results;

呼び出すresults[pol1][pol2][rot1][rot2];と、正しいポリゴンが得られます。

1 つの結果にアクセスするのは非常に非効率的であることはわかっていますが、どうすれば改善できますか?

4

1 に答える 1

2

それは多くのことに依存します、私の解決策はミキシングstd::tuplestd::map

typedef std::tuple<Polygon , Polygon , int, int> Params;

std::map<Params, Polygon> results;

パラメータを結果にマッピングします。この場合、特定の入力の結果を効率的に見つけることができます。

使用するには、次の理由でoperator<forをオーバーロードする必要があります。Polygonstd::map

struct Polygon
{
// ...
};

inline bool operator<(const Polygon &p1, const Polygon &p2)
{
    return ...;
}

Polygon p1, p2, p3;

// ...

results.insert(std::make_pair(std::make_tuple(p1, p2, 1, 2), p3));
于 2013-04-17T16:12:38.450 に答える