Pointers in Containern. STL (Teil 16)

Bewerten Sie diesen Artikel




Indizes in Containern, STL, Programmieren für Anfänger

STL-Containern erheblich reduzieren die Komplexität des Schreibens Code, Arbeiten mit dynamischen Datenstrukturen und, das Wichtigste, erhöhen ihre Irrtumslosigkeit. Aber in einigen Fällen, bei der Arbeit mit großen Datenelemente in Containern, Diese Technik kann den unvermeidlichen Verlust an Produktivität produzieren. Dies ist, dass da der Betrieb Zimmer ein Containerelement, und anschließender Verschiebung Elemente können eine Kopie von Elementen erfordern.

Notiz: Die Schwere dieser Effekte hängt von der Art des Behältnisses, und aus den Transaktionen. beispielsweise, Austauschbetrieb 2 Elemente in der Sortierung erfordern 3 copyings Typ Container Vektor und wird nicht verlangen, zusätzliche Kopie für Container Liste. Aber der Betrieb der anfänglichen Raum in dem Behälter (push_back(), einfügen() usw.) immer eine Kopie.

Dies kann ein Problem für eine Anwendung sein,, wenn Operationen an den Behältern ist entscheidend für die Laufzeit (oder Sie scheinen solche). Es gibt noch komplizierter Fälle, wenn eine Klasse Containerobjekt ist nicht Betrieb aufgenommen, oder wenn die Objekte referenziert werden Objekte selbst, Voll-Backups, für die Sie rekursive Prozeduren folgenden alle Links durchführen möchten (die, in Python, und der andere eine tiefe Kopie namens).

Alles funktioniert gut, wie bisher - eine Gruppe von Datensätzen auf beliebigen Feldern sortieren und in beliebiger Reihenfolge:

16-1

(beachten Sie, dass das Ausfüllen dieses Programm, das Sie für Strg + D benötigen - End Of File ... in den Widows, sicherlich, по Strg + Z)

aber! ... Vor allem wurden Debuggen "Spuren" Positive links Konstruktoren und Destruktoren Aufzeichnungen, und die Aufzeichnung konstruiert 8 Zeit, und der Destruktor wird nur dann ausgelöst 4, für lokale Array an der Austrittsstelle des Blocks. Lokale Array im Allgemeinen nicht für uns von Interesse. Er wurde eingeführt, um die beispielsweise nur als eine Reihe von Initialisierungswerte zu vereinfachen. Aber für den Rekord, in einen Behälter gegeben,, Aufzeichnungen Zerstörung tritt nicht auf, und wir bekommen einen offenen Speicherleck. Aber schlimmer, nachdem wir das Einzelteil aus dem Behälter zu entfernen (ohne weitere Maßnahmen zu ergreifen), wir kann nicht Löschen Sie den Datensatz, fordern sie löschen. Dies liegt daran,, nach Aufruf löschen() Wir verloren auf einen Rekord nur Weg durch den Iterator (der Code eine Schleife löschen(), so grafisch, gleichwertig klar(), die Wirkung davon, Es ist das gleiche).

Abschluss, die aus Beispiel hergestellt werden, Aussehen:

  • Objekte in Behälter setzen nicht, und Indizes sie, kann erheblich die Rechenkosten der Manipulation reduzieren (aber immer prinzipien, ob diese Gewinne an der aktuellen Rechenleistung?).

  • Ersatzeinrichtungen Zeiger in Containern macht den Code im Sinne von versteckten subtilen Bugs viel gefährlicher ist, Und ein so ernstes Niveau, die weiter kann zu einem Absturz der Anwendung führen.

Hier können einige Hilfe haben intelligente Zeiger der neuesten C ++ Standard (shared_ptr oder weak_ptr, aber nicht unique_ptr und nicht das gute alte und problematische auto_ptr), uns für diese im vorherigen Code, nur ändern 4 Linie:

In Windows, shared_ptr erforderlich #einschließen <Erinnerung> , und in anderen Systemen, die nicht notwendigerweise.

und Anwendungsverhalten wesentlich ändern:

16-2

Aber wir sollten uns nicht täuschen recklessly, so wie intelligente Zeiger, Entfernen von etwas, erzeugen andere mögliche Bedenken (wie zyklische Verknüpfungen usw.. über die viel geschrieben genug).

Newsletter neue Lektionen über die Programmierung:

Öl

Etwa Öl

praktische Erfahrungen über die Softwareentwicklung 40 Jahre. Lehrer Globale Logik internationales Softwareunternehmen. IBM Developer Works Permanent Autor von Publikationen. Wissenschaftliche Herausgeber der Computerliteratur-Verlag "Symbol-Plus", Sankt Petersburg.

Hinterlasse eine Antwort

Platz Code in Tags: <pre class="lang:c ++ dekodieren:true ">DEIN CODE</Vor>