Mi dispiace dire che i tuoi compagni di scuola hanno completamente torto. Se i tuoi compagni di scuola possono dire onestamente che "i vettori sono elenchi concatenati" allora devi rispettosamente dire loro che hanno bisogno di raccogliere a good C++ book (o qualsiasi libro di informatica decente) e leggerlo. O forse anche gli articoli di Wikipedia per vectors e lists. (Vedi anche gli articoli per dynamic arrays e linked lists.)
vettori (come in std::vector
) non sono liste collegate. (Notare che std::vector
non deriva da std::list
). Mentre entrambi possono archiviare una raccolta di dati, come fa un vettore è completamente diverso da come lo fa un elenco collegato. Pertanto, hanno caratteristiche di prestazione diverse in diverse situazioni.
Ad esempio, le inserzioni sono un'operazione a tempo costante su elenchi collegati, mentre è un'operazione a tempo lineare su vettori se è inserita in un punto diverso dalla fine. (Tuttavia, è ammortizzati costante di tempo se si inserisce alla fine di un vettore.)
Il std::vector
di classe in C++ sono richiesto essere contiguo dallo standard C++:
23.2.4/1 modello Classe vector
un vector
è una sorta di sequenza che supporta iteratori ad accesso casuale. Inoltre, supporta operazioni di inserimento e cancellazione costanti (ammortizzate) alla fine; inserire e cancellare nel mezzo prendere tempo lineare. La gestione dello storage viene gestita automaticamente, sebbene possano essere forniti suggerimenti per migliorare l'efficienza. Gli elementi di un vector
vengono memorizzati in modo contiguo, nel senso che se v
è un vector<T, Allocator>
dove T
è un certo tipo diverso da bool
, poi obbedisce l'identità &v[n] == &v[0] + n
per tutti 0 <= n < v.size()
.
Confronti che, per std::list
:
23.2.2/1 modello Classe list
Un list
è una sorta di sequenza che supporta iteratori bidirezionali e concede il tempo di inserimento costante e cancellare le operazioni ovunque all'interno della sequenza, con gestione della memoria gestita automaticamente. A differenza dei vettori (23.2.4) e deques (23.2.1), l'accesso casuale rapido agli elementi della lista non è supportato, ma molti algoritmi hanno comunque bisogno di un accesso sequenziale.
Chiaramente, lo standard C++ stabilisce che un vettore e un elenco sono due contenitori diversi che fanno le cose in modo diverso.
Non è possibile "interrompere" un vettore (almeno non intenzionalmente) semplicemente chiamando erase()
con un iteratore valido. Ciò renderebbe piuttosto inutile il std::vector
poiché il punto della sua esistenza è gestire la memoria per te!
@In silico: per quanto riguarda la "pausa", chiamando 'cancella' invaliderà gli iteratori agli elementi oltre il punto cancellato (e 'fine'). –
@Matthieu M.: Esatto, la chiamata 'erase()' invaliderà alcuni iteratori, ma non interromperà o corromperà il vettore stesso. Stavo affrontando l'affermazione che 'erase()' interromperà il vettore, dal momento che si tratta di un elenco collegato, "che è un'assurdità. –
@In silico: sì capisco cosa intendi, ma penso che l'OP (ei suoi amici) usassero "break" perché non capivano cosa significasse invalidare, poiché cancellare un elemento da una lista non invalida nessun altro iteratore. –