Puntatori in contenitori. STL (parte 16)

Puntatori in contenitori. STL (parte 16)
3 (60%) 2 voti




Indici in contenitori, STL, La programmazione per i principianti

contenitori STL riducono notevolmente la complessità di scrivere codice, lavorare con le strutture dati dinamiche e, cosa più importante, aumentare la sua inerranza. Ma in alcuni casi, quando si lavora con grandi elementi di dati in contenitori, Questa tecnica può produrre l'inevitabile perdita di produttività. Questo è, che, poiché l'operazione stanza un elemento contenitore, e successiva spostamento elementi possono richiedere una copia di elementi.

nota: La gravità di questi effetti dipende dal tipo di contenitore, e dalle operazioni. per esempio, operazione di interscambio 2 elementi in smistamento richiedono 3 copyings tipo di contenitore vettore e non richiede copia aggiuntiva per container lista. Ma l'operazione dello spazio iniziale nel contenitore (respingere(), inserire() et al.) sempre fare una copia.

Questo può essere un problema per un'applicazione, quando operazioni sui contenitori è critico per runtime (o sembrare a voi come). Ci sono anche casi più complicati, quando un oggetto contenitore classe non viene prelevato operazione, o quando gli oggetti sono referenziati oggetti stessi, backup completi per i quali si desidera eseguire procedure ricorsive seguenti tutti i link (il, in Python, e l'altro è chiamato una copia profonda).

Tutto funziona bene, come prima - ordinare un insieme di record sui campi arbitrari e in qualsiasi ordine:

16-1

(Si prega di notare, che completando questa applicazione è necessario per Ctrl + D - End Of File ... in Vedove, certamente, по Ctrl + Z.)

ma! ... Soprattutto debug positivi "tracce" sono stati lasciati costruttori e distruttori record, e la registrazione costruito 8 tempo, e il distruttore viene attivato solo 4, per matrice locale nel punto di uscita del blocco. matrice locale in genere non di interesse per noi. Egli è stato introdotto per semplificare l'esempio, solo come un insieme di valori di inizializzazione. Ma per la cronaca, posto in un contenitore, record distruzione non si verifica, e otteniamo una perdita di memoria candida. ma il peggio, dopo togliamo l'oggetto dal contenitore (senza prendere ulteriori azioni), noi non può eliminare il record, chiedendo per essa cancellare. Questo perché, dopo la chiamata cancellare() Abbiamo perso a un record solo percorso attraverso l'iteratore (il codice mostra un loop cancellare(), così graficamente, equivalente pulire(), il cui effetto, È lo stesso).

conclusione, che può essere fatto da Esempio, sguardi:

  • porre oggetti in contenitori non, e Indici essi, può ridurre significativamente il costo computazionale della manipolazione (ma sempre di principio se questi guadagni alla potenza di calcolo corrente?).

  • servizi di sostituzione puntatori in contenitori rende il codice è molto più pericoloso, nel senso di bug sottili nascosti, E un livello così grave, che può ulteriormente portare ad un crash dell'applicazione.

Ecco qualche aiuto può avere puntatori intelligenti del più recente standard C ++ (shared_ptr o weak_ptr, ma non unique_ptr e non il buon vecchio e problematico auto_ptr), noi per questo nel codice precedente, basta cambiare 4 linea:

In Windows, shared_ptr necessaria #includere <memoria> , e in altri sistemi, non necessariamente.

e cambiamento di comportamento dell'applicazione in modo significativo:

16-2

Ma non dobbiamo illuderci incautamente, puntatori in modo intelligente, rimozione di alcuni, generare altri problemi potenziali (come ad esempio i collegamenti ciclici ecc. di cui molto è scritto abbastanza).

Newsletter nuove lezioni sulla programmazione:

olio

Di olio

esperienze pratiche circa lo sviluppo del software 40 anni. Maestro globale Logic società di software internazionale. IBM Developer funziona autore permanente di pubblicazioni. redattore scientifico del computer casa editrice letteratura "Simbolo-Plus", San Pietroburgo.

Lascia un Commento

Inserire il codice nei tag: <pre class="lang:C ++ decodifica:true ">IL TUO CODICE</pre>