2017-02-07 2 views
3

Hier ist das Zitat aus „Effective STL“:Container Vorder- und Rückseite Verhalten

Wenn Sie ein Objekt aus einem Behälter erhalten (. Über beispielsweise vorne oder hinten), was Sie setzen ist eine Kopie von dem, was war enthalten. Kopieren, kopieren. Das ist der STL-Weg.

Ich habe es schwer gehabt, diesen Teil zu verstehen. Soweit ich weiß Front gibt die Referenz des ersten Elements (zumindest für std::vector). Könnten Sie bitte obigen Satz erklären?

+2

Wo ist das in dem Buch? Ich möchte versuchen, es zu finden –

+0

Dies ist das Zitat aus dem Artikel 3. Kopieren billig und korrekt für Objekte in Containern. –

+0

Es ist eine Weile her, seit ich Effektive STL gelesen habe, aber entweder Scott Myers sagte mehr dazu, und dieser Kontext ist nicht in der Frage, oder das Buch wird nicht für C++ 11 und darüber hinaus aktualisiert. – StoryTeller

Antwort

2

Die Idee mit einer Erklärung, wie das ist, wenn Sie ein Element aus dem Behälter erhalten möchten, Sie nicht halten einen Verweis oder Zeiger auf das Element in dem Behälter, erstellen Sie eine Kopie davon (aus der Referenz kehren diese Methoden zurück). Die Funktion zurück, für back() und front(), sind sekundäre Bedenken und wahrscheinlich das Problem zu verwirren - auch die Errata entfernt die Erwähnung von ihnen.

Container können neu zugeordnet werden (besonders vector), wobei Sie nicht unbedingt vom Container benachrichtigt werden, die Elemente werden in den Speicher verschoben und plötzlich haben Sie einen ungültigen Verweis oder Zeiger.

Berücksichtigen Sie die Zeit des Hinweises, bevor Sie Semantik und bewegliche Objekte verschieben usw. Aber das allgemeine Prinzip gilt weiterhin, halten Sie keine Referenzen oder Zeiger auf Objekte, die ungültig werden könnten.

"Wert Semantik" ist ein starkes Thema, das nicht nur durch die Standardbibliothek, sondern das gesamte C++ läuft.

5

Dies war tatsächlich ein Fehler in einer früheren Ausgabe des Buches. Von den errata:

! 6/29/01 jk  20 The first para of Item 3 is incorrect: front  7/25/04 
        and back do NOT return copies of elements, they 
        return references to elements. I 
        removed all mention of front and back. 

So die Erklärung des Satzes ist: woops, Zeit, eine neue Ausgabe zu erhalten!

Verwandte Themen