2010-01-21 14 views
17

Lo siento si esto se ha preguntado antes, pero me pregunto cuál es el uso de std::vector::front().¿Para qué se utiliza std :: vector :: front()?

¿Hay alguna razón para usar, p. myvector.front() en lugar de myvector[0] o myvector.at(0)?

+0

más interesante ... ¿por qué hay un frente() cuando ya hay un comienzo()? – Inverse

+0

@Inverse: porque los adaptadores de contenedor 'std :: queue' y' std :: stack' tienen 'front()' pero no 'begin()'. –

+0

Y para ser coherente con 'back()', 'myvector [myvector.size() - 1]' no es tan directo. – dalle

Respuesta

17

Algunos de los algoritmos genéricos que también funcionan en listas lo usan.

Este es un ejemplo de un principio general: si proporciona métodos de acceso para todos los semántica que el apoyo, no sólo la aplicación te apoyo, es más fácil escribir de forma genérica y por lo tanto más fácil de reutilizar el código.

+1

+1: Edición sólida. –

+1

Ah, entonces se trata más de consistencia con otras clases de contenedor. Simplemente por curiosidad: ¿es vector :: front() equivalente a [0] o a at (0)? Quiero decir, ¿qué sucede si el vector está vacío? – Tim

+1

@Tim: Buena pregunta. Wikipedia dice comportamiento indefinido: http://en.wikipedia.org/wiki/Vector_(C%2B%2B) y http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html dice lo mismo como [0], que supongo que tampoco está definido si el vector está vacío. – dmckee

13

Si el tipo de myvector cambia a otro tipo de datos que no es indexable, como una lista, no tendrá que cambiar el código que accede al frente del contenedor.

+2

Las respuestas de tu y la del póster anterior deben combinarse. Concepto abstracto + ejemplo concreto para el triunfo. – Omnifarious

4

Hacer esto proporciona algo llamado polimorfismo estático.

Digamos que he escrito un algoritmo utilizando una clase de cola. Tiene una función front() para obtener el siguiente elemento de la cola, y una función enqueue() para agregar al final de la cola. Ahora digamos que descubrí que esta clase de cola está escrita mal y muy despacio, y prefiero usar std :: vector, que es mucho más rápido (sé que hay una cola std ::, esto es solo un ejemplo). Si la única forma de obtener el primer elemento de un std :: vector fuera con v [0], tendría que revisar mi código y reemplazar todas mis llamadas a front() con [0]. Pero al implementar front(), std :: vector ahora puede ser un reemplazo directo para mi clase de cola. El único código que tengo que cambiar es el tipo de contenedor en mi algoritmo.

Cuestiones relacionadas