2009-07-13 9 views
1

Existe-t-il une structure de données (facilement disponible en STL ou boost), qui accepte deux arguments et l'associe à une certaine valeur?Structure de données similaire à une carte à 2 arguments

Des exemples seraient pour renvoyer certaines informations dans une grille de coordonnées ou d'obtenir le poids d'une arête dans un graphe:

coordinate_quadrant (-1, -1) = 3

weight_of (u, v) = 10

L'exemple de quadrant pourrait être fait dans une fonction simple avec quatre instructions if. Je cherche principalement un exemple qui conviendrait à l'exemple du poids. J'essaie d'éviter d'avoir à créer une classe edge et de la passer dans la fonction weight_of (edge ​​edge).

Répondre

11

Vous pouvez utiliser std :: map < std :: paire Type1, Type2 >, Type3 >.

0

Utilisez un objet qui est une paire d'entiers sur l'extrémité arrière. En d'autres termes, implémentez la carte, mais pour cet objet paire. Vous ne pouvez pas remplacer l'opérateur [] pour accepter plusieurs arguments, mais vous pouvez remplacer l'opérateur () sur une classe de mappage personnalisée, de sorte que vous puissiez obtenir du sucre syntaxique, par exemple. my_map[row](col) = whatever

1

Je considérerais les choix suivants:

Option 1

std :: carte avec std :: paire < Type1, Type2> comme la clé et Type3 la valeur

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

Option 2

2 dimensions std :: vecteur

Dans le cas où le Type1 et Type2 sont des nombres entiers, comme vous pourriez trouver lors de la modélisation d'un graphique ou espace cartésien: std :: vector < std :: vector < Type3 >> données;

Option 3

classe définie par l'utilisateur contenant Type1 et Type2, qui peuvent être mises en correspondance Type3

Dans le cas où vous pourriez jamais vouloir décorer vos deux types avec plus de valeurs, vous pourriez définir une classe qui contient à la fois de vos types, et d'utiliser un std :: carte pour la carte au troisième type:

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; 

l'avantage de l'option 1 est qu'il est très rapide et facile à coder, et devrait avoir du sens pour quiconque connaît le C++. L'option 2 est probablement un peu plus rapide, et a l'avantage supplémentaire qu'elle peut facilement être modifiée pour avoir plus de dimensions. L'inconvénient de l'option 2 est que vos valeurs doivent être des indices entiers dans le vecteur bidimensionnel.À mon avis, l'option 3 est le meilleur choix pour moi car elle est lisible, ne pose aucune exigence sur le type de Type1 et Type2, et peut être étendue pour contenir plus de données d'une manière très raisonnable. L'inconvénient de l'option 3 est que vous devez définir un StrictWeakOrdering pour comparer les objets MaClasse les uns aux autres, mais qui est assez simple:

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

Faire qu'une fonction de membre de votre classe, et vous devriez être prêt à aller.

Comme beaucoup de choses dans la programmation, il n'y a pas de bonne réponse tant que vous ne tenez pas compte des spécificités de ce que vous faites et du temps que vous êtes prêt à investir. N'oubliez pas de vérifier les principales erreurs d'existence et hors limites. :)

Questions connexes