2013-04-17 5 views
3

I ont une structure et une fonction Polygon avec la signature suivanteComment améliorer une structure stockant de nombreux résultats?

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

dans lequel pol1 et pol2 sont Polygon s, rot1 et rot2 sont appliqués à rotation pol1 et pol2.

Je dois stocker tous les résultats de myfunction appliqués à un ensemble de polygones et un ensemble de rotations admissibles. Par exemple, si j'ai 100 polygones et 4 rotations admissibles, j'ai besoin de stocker 100 * 100 * 4 * 4 = 160000 polygones. Je sais que j'ai besoin de beaucoup de mémoire, mais je suis d'accord.

Pour le moment, je les stocker dans un récipient comme:

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

afin que l'appel results[pol1][pol2][rot1][rot2]; je reçois le polygone droit.

Je sais que l'accès à un seul résultat peut être très inefficace, alors comment puis-je l'améliorer?

Répondre

2

Cela dépend de beaucoup de chose, ma solution est le mélange std::tuple et std::map

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

std::map<Params, Polygon> results; 

Quelles cartes paramètres aux résultats. Dans ce cas, vous pouvez trouver le résultat d'une entrée spécifique de manière efficace.

Pour l'utiliser, vous devez surcharger operator< pour Polygon en raison de std::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)); 
+0

Bonne solution! Je vous remercie. – 888

+1

Puisqu'il n'y a que 4 rotations, je dirais qu'il serait préférable de ne pas les inclure comme des clés de carte, mais plutôt comme des index. Par exemple, pour chaque combinaison de deux rotations, il pourrait y avoir une carte, en utilisant une paire de polygones comme clé. –

+0

@ Zyx2000 Merci pour la suggestion, mais 4 était juste un exemple. Il pourrait y avoir beaucoup plus de rotations. – 888

Questions connexes