2010-01-21 2 views
17

Désolé si cela a été demandé auparavant, mais je me demande ce que l'utilisation de std::vector::front() est.À quoi sert std :: vector :: front()?

Y a-t-il une raison d'utiliser par ex. myvector.front() plutôt que myvector[0] ou myvector.at(0)?

+0

plus intéressant ... pourquoi y a-t-il un front() quand il y a déjà un begin()? – Inverse

+0

@Inverse: parce que les adaptateurs de conteneur 'std :: queue' et' std :: stack' ont 'front()' mais pas 'begin()'. –

+0

Et pour être cohérent avec 'back()', myvector [myvector.size() - 1] 'n'est pas si simple. – dalle

Répondre

17

Certains des algorithmes génériques qui fonctionnent également sur les listes l'utilisent.

Voici un exemple d'un principe général: si vous fournissez accesseurs pour tous les sémantique vous aider, non seulement la mise en œuvre vous aider, il est plus facile d'écrire génériquement et donc plus facile de réutiliser le code.

+1

+1: Modification solide. –

+1

Ah, il s'agit donc plus de cohérence avec d'autres classes de conteneurs. Juste par curiosité: est-ce que vector :: front() est équivalent à [0] ou à at (0)? Je veux dire, que se passe-t-il si le vecteur est vide? – Tim

+1

@Tim: Bonne question. Wikipedia indique un comportement indéfini: http://en.wikipedia.org/wiki/Vector_(C%2B%2B) et http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html dit la même chose comme [0] que je suppose est également indéfini si le vecteur est vide. – dmckee

13

Si le type de myvector change pour un autre type de données qui n'est pas indexable, comme une liste, vous n'aurez pas à modifier le code qui accède à l'avant du conteneur.

+2

Vos réponses et celles du poster précédent doivent être combinées. Concept abstrait + exemple concret pour la victoire. – Omnifarious

4

Ce faisant fournit quelque chose appelé polymorphisme statique.

Disons que j'ai écrit un algorithme en utilisant une classe de file d'attente. Il a une fonction front() pour obtenir l'élément suivant de la file d'attente, et une fonction enqueue() à ajouter à la fin de la file d'attente. Maintenant disons que j'ai découvert que cette classe de file d'attente est écrite pauvrement et très lentement, et je préfère utiliser std :: vector qui est beaucoup plus rapide (je sais qu'il y a une file d'attente std ::, c'est juste un exemple). Si la seule façon d'obtenir le premier élément d'un vecteur std :: était avec v [0], je devrais passer par mon code et remplacer tous mes appels à front() par [0]. Mais en implémentant front(), std :: vector peut maintenant être un remplacement direct pour ma classe de file d'attente. Le seul code que je dois changer est le type du conteneur dans mon algorithme.