2010-01-21 6 views
17

Sorry, wenn das schon einmal gefragt wurde, aber ich frage mich, was die Verwendung von std::vector::front() ist.Wofür wird std :: vector :: front() verwendet?

Gibt es einen Grund, z.B. myvector.front() eher als myvector[0] oder myvector.at(0)?

+0

Interessanter ... Warum gibt es eine Front() wenn es bereits einen Anfang() gibt? – Inverse

+0

@Inverse: weil die Containeradapter 'std :: queue' und' std :: stack '' front() 'haben, aber nicht' begin() '. –

+0

Und um mit 'back()' konsistent zu sein, ist 'myvector [myvector.size() - 1]' nicht so geradlinig. – dalle

Antwort

17

Einige der generischen Algorithmen, die auch auf Listen arbeiten, verwenden sie.

Dies ist ein Beispiel für einen allgemeinen Grundsatz: Wenn Sie Accessoren für alle Semantik Sie unterstützen nicht nur die Implementierung Sie Unterstützung, ist es einfacher, allgemein zu schreiben und daher leichter zu Code wiederverwenden.

+1

+1: Solid bearbeiten. –

+1

Ah, es geht also eher um Konsistenz mit anderen Containerklassen. Nur aus Neugier: ist vector :: front() äquivalent zu [0] oder zu at (0)? Ich meine, was passiert, wenn der Vektor leer ist? – Tim

+1

@Tim: Gute Frage. Wikipedia sagt undefiniertes Verhalten: http://en.wikipedia.org/wiki/Vector_(C%2B%2B) und http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html sagt das gleiche als [0], was wohl auch undefiniert ist, wenn der Vektor leer ist. – dmckee

13

Wenn sich der Typ von myvector in einen anderen Datentyp ändert, der nicht indexierbar ist, z. B. eine Liste, müssen Sie den Code, der auf die Vorderseite des Containers zugreift, nicht ändern.

+2

Ihre und die vorherigen Antworten des Posters sollten kombiniert werden. Abstraktes Konzept + konkretes Beispiel für den Sieg. – Omnifarious

4

Dies führt zu etwas, das als statischer Polymorphismus bezeichnet wird.

Angenommen, ich habe einen Algorithmus geschrieben, der eine Queue-Klasse verwendet. Es hat eine front() - Funktion, um das nächste Element der Warteschlange zu erhalten, und eine enqueue() - Funktion, die zum Ende der Warteschlange hinzugefügt wird. Nehmen wir an, ich habe entdeckt, dass diese Queue-Klasse schlecht und sehr langsam geschrieben ist, und ich würde lieber std :: vector verwenden, was viel schneller ist (ich weiß, dass es eine std :: queue gibt, das ist nur ein Beispiel). Wenn ich das erste Element eines std :: vectors nur mit v [0] erhalten könnte, müsste ich meinen Code durchgehen und alle meine Aufrufe von front() durch [0] ersetzen. Durch die Implementierung von front() kann std :: vector nun ein Ersatz für meine Queue-Klasse sein. Der einzige Code, den ich ändern muss, ist der Typ des Containers in meinem Algorithmus.