2010-04-23 29 views

Répondre

9

Les paires seraient affichés en utilisant la paire operator< (la valeur par défaut pour comparer le fonctionnement std::map), qui

Retours: x.first < y.first || (!(y.first < x.first) && x.second < y.second)

(C++ 03, 20.2.2/6) Notez qu'il pourrait être déroutant d'utiliser une paire comme une clé de la carte, en particulier lorsque vous travaillez avec des itérateurs de carte (it->first.first pour obtenir le premier élément de la paire de clés semble ridicule). Mais dans certains cas, cela peut être plus facile que de créer une nouvelle structure pour la clé.

Comme avec tout, utilisez avec soin, et si ce n'est pas simple et facile à comprendre, il est probablement préférable de trouver une autre façon de le faire.

+0

merci pour votre réponse! – jm1234567890

1

Vous pouvez. À mon avis, vous devriez faire quelque chose de plus expressif que cela, car std::pair n'était pas fait pour ça. Par exemple, si vous voulez stocker des chaînes dans une carte par leur hachage, vous pouvez faire quelque chose comme:

struct Hash { 
    int hash_low; 
    int hash_high; 

    bool operator<(const Hash& other) const; 
}; 

Et puis utilisez map<Hash,string> plutôt que map<pair<int,int>,string>.

+0

Peut-être qu'un simple "typedef pair Hash" serait suffisant? Je ne peux pas imaginer que la classe de paire soit significativement moins efficace qu'une structure ... –

+0

Ce n'est pas l'efficacité, c'est l'expressivité. Tout ce qui fonctionne pour vous: un 'typedef', un' struct', peu importe. Vous utilisez des choses comme «paire» lorsque vous écrivez une bibliothèque, pas de code concret, à usage unique. – wilhelmtell

1

Si vous cherchez à avoir deux index pour votre table de hachage, alors vous devriez regarder Boost::multiindex conteneurs.

En réponse à votre question, pourquoi ne pas faire face aux limitations que d'autres ont signalées? Je suis toujours pour toute solution qui soit claire, facile à utiliser et qui corresponde aux objectifs du problème.