2013-04-17 60 views
3

我有一個Polygon結構和具有以下簽名如何改進存儲許多結果的結構?

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

一個功能,其中POL 1和POL是Polygon S,ROT1和ROT2是施加到POL 1和POL轉動。

我需要存儲應用於一組多邊形和一組允許旋轉的所有myfunction的結果。例如,如果我有100個多邊形和4個允許旋轉,我需要存儲100 * 100 * 4 * 4 = 160000個多邊形。我知道我需要大量的記憶,但我對它很滿意。

對於我存儲他們在那樣的容器的時刻:

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

,這樣調用results[pol1][pol2][rot1][rot2];我得到正確的多邊形。

我知道訪問單個結果可能效率很低,那麼我該如何改進呢?

回答

2

這取決於很多事情,我的解決方案是混合std::tuplestd::map

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

std::map<Params, Polygon> results; 

哪些參數映射到結果。在這種情況下,您可以高效地找到特定輸入的結果。

要使用,你必須重載operator<,因爲std::mapPolygon

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)); 
+0

很好的解決!謝謝。 – 888

+1

由於只有4次旋轉,我會說最好不要將它們包含爲地圖鍵,而應將其作爲索引。例如,對於兩個旋轉的每個組合,可以有一個地圖,使用一對多邊形作爲關鍵。 –

+0

@ Zyx2000謝謝你的建議,但4只是一個例子。可能會有更多的旋轉。 – 888