2010-02-10 1 views

Répondre

18

std::pair fournit des constructeurs pré-écrits et des opérateurs de comparaison. Cela leur permet également d'être stockés dans des conteneurs comme std :: map sans avoir besoin d'écrire, par exemple, le constructeur de la copie ou un ordre faible strict via operator < (tel que requis par std::map). Si vous ne les écrivez pas, vous ne pouvez pas vous tromper (rappelez-vous le fonctionnement de la commande faible stricte?). Il est donc plus fiable d'utiliser std::pair.

+1

Je ne pense pas que std :: pair fournisse des constructeurs ou des opérateurs pour ses membres. À quoi penses-tu exactement? – Manuel

+1

@Manuel, en fait je viens de vérifier et bien sûr, 'paire' fournit un ctor par défaut, et un modèle de copie ctor. Fait sens - de cette façon, dans chaque cas, 'pair' permet de l'appeler si & seulement si les types sous-jacents le permettent. –

+1

Oui, mais l'OP semblait suggérer que std :: pair * magiquement * générait ces membres pour les types sous-jacents. C'est bizarre que cette réponse soit celle qui a été acceptée. – Manuel

5

En termes d'allocation de mémoire et d'efficacité, il n'y a pas de différence - puisque c'est exactement ce qu'est un std::pair.

+0

C'est ce qui répond à ce que je me demandais, je me suis soudainement rendu compte que l'efficacité dépend vraiment de ce que vous feriez, c'est un peu trop d'informations. Je vais accepter la question d'AshleysBrain pour penser plus loin ... –

+2

Pas de problème, mais il aurait été plus logique de poser des questions sur la comparaison de la facilité d'utilisation si c'est ce qui vous intéresse. Naveen et moi avons tous deux répondu à la question comme indiqué. (Ne pas se plaindre, juste dire ...) –

+0

Hmm, semble avoir fait une grave faute de frappe dans mon commentaire. "C'est la réponse que je me demandais", il aurait dû être. J'ai donné à AshleysBrain la réponse acceptée car il était rapide et a donné une bonne réponse, tout comme vous. C'était difficile de choisir, mais je suis allé pour celui qui en bénéficierait le plus. –

1

Aucune différence en termes d'allocation de mémoire ou d'efficacité. En fait, dans l'implémentation STL, j'utilise la paire est définie comme struct pair

+0

Quelle implémentation STL utilisez-vous? –

+0

J'utilise celui qui vient avec le compilateur VC9. – Naveen

+1

Oui, cela est conforme à la convention commune selon laquelle si un type défini par l'utilisateur expose des membres de données publiques (comme 'pair' avec' first' et 'second'), il doit alors être' struct'. – Manuel

15

std::pair trouve un certain nombre de constructeurs et d'opérateurs. Un struct autorise les champs nommés (autres que first et second) et est prêt à être étendu à tout moment.

Préférez un struct lorsque cela est possible, cela peut impliquer quelques frais généraux, mais est nettement plus facile pour la maintenance.

+11

+1 pour le commentaire de maintenance. J'ai travaillé avec un groupe d'ingénieurs de New Jersey qui essayait de tout faire (et je veux dire tout) avec la STL, et plutôt que de créer des classes/structures appropriées quand le design indiquait, ils utilisaient un conteneur STL. Le code était jonché de "if (route.first.second [* iter] .first) {...}". Pouah! –

+0

Bonne idée, gardez cela à l'esprit pour plus tard. –

Questions connexes