2010-10-19 12 views
51

È appena tornato ad usare C++ e si sta provando a convertire un semplice programma Java che ho scritto di recente.Qual è la versione C++ di ArrayList di Java

Qual è l'equivalente preferito di Java ArrayList in C++?

+0

http://stackoverflow.com/questions/14426338/java-arraylist-in-c –

risposta

66

Utilizzare std::vector class dalla libreria standard.

+2

Hmmm ... dall'altra risposta, sembra che il vettore non sia implementato come elenco collegato? Ho ragione? Sto usando questa lista come una raccolta che avrà un fatturato abbastanza elevato di oggetti aggiunti e rimossi da essa. Questa matrice è in realtà l'implementazione migliore? O c'è una versione di lista collegata? – interstar

+3

@interstar - assolutamente corretto. Se vuoi davvero la semantica delle liste collegate, usa 'std :: list', anche se poi perdi l'indicizzazione (non' operator [] ') quindi non è davvero una matrice. 'list' che ha le sue idiosincrasie in modo tale che' vector' è spesso una scelta migliore. Nei contenitori C++ standard, si dovrà scendere a compromessi in un modo o nell'altro. Guarda "deque", che potrebbe offrirti un risultato migliore per te. È (relativamente) facile misurare 'vector' vs' deque' vs 'list' poichè sono ampiamente intercambiabili nel codice - basta usare un typedef per il contenitore ad es. 'typedef vector MyList'. –

+0

bene, proverò prima il vettore. Perché l'indice è utile. Se è troppo lento, potrei passare alla lista collegata. Grazie – interstar

35

Un paio di punti aggiuntivi riutilizzano lo vector qui.

differenza ArrayList e Array in Java, non c'è bisogno di fare nulla di speciale per il trattamento di un vector come un array - all'archiviazione sottostante in C++ è garantito per essere contigui ed efficiente indicizzabile.

A differenza di ArrayList, un vector può conservare efficacemente i tipi primitivi senza incapsulamento come oggetto a tutti gli effetti.

Quando si rimuovono gli articoli da un vector, tenere presente che gli elementi sopra l'elemento rimosso devono essere spostati verso il basso per conservare l'archiviazione contigua. Questo può diventare costoso per i contenitori di grandi dimensioni.

Assicurarsi di memorizzare oggetti complessi nello vector che il loro costruttore di copia e gli operatori di assegnazione siano efficienti. Sotto le copertine, C++ STL usa questi durante le operazioni di manutenzione dei container.

Consigli su reserve() durante l'archiviazione in anticipo (ad esempio durante la costruzione del vettore o il tempo di inizializzazione) per ridurre al minimo la riallocazione della memoria su un'estensione successiva trasferita da Java a C++.

+1

La risposta migliore di gran lunga dovrebbe essere accettata. –

Problemi correlati