2010-10-24 12 views
21

Quali sono i casi di utilizzo generale per C++ standard library containers?Casi di utilizzo generali per contenitori C++

  • bitset
  • deque
  • lista
  • mappa
  • multimap
  • multinsieme
  • priority_queue
  • coda
  • set
  • pila
  • vettore

Per esempio, una mappa è generalmente migliore per una ricerca abbinato.

+1

Questo è un duplicato di [In quale scenario utilizzo un particolare contenitore STL?] (Https://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular- stl-container) - le risposte accettate in entrambi usano la stessa identica immagine, e quella era precedente, _e_ ha più risposte, quindi ... Non sembra esserci alcuna necessità di avere 2. –

risposta

78

Un'immagine vale più di mille parole.

container choice flowchart

E 'disponibile da nolyc, il bot informativo di ## C++ su Freenode, utilizzando il comando "scelta contenitore" o "containerchoice". Il link a questa immagine che ricevi in ​​risposta è ospitato al adrinael.net, il che suggerisce che dovremmo ringraziare Adrinael, membro della comunità ## C++ di Freenode.

+13

+1: Questo è un foto abbastanza utile. – Arun

+1

Immagine molto utile, praticamente esattamente quello che stavo cercando – Elpezmuerto

+2

Avete una versione aggiornata di questo per riflettere i nuovi contenitori C++ 11? – Arbalest

13

bitset - utilizzato per memorizzare bit. Uso generale: memorizza i valori di alcuni contrassegni. Non hai bisogno di più di 1 bit per quello.

deque - coda a doppio attacco - push_back, push_front, pop_back e pop_front - metodi di classe base. Contenitore "non ordinato" (non ordinato).

list - Elenco collegato. Questo contenitore non è continuo alla memoria. Il tempo per aggiungere ed eliminare elementi è O (1), ma cercare un elemento specifico è O (n). Contenitore non ordinato

map - contenitore, memorizza le coppie (std :: coppia). Il primo è la chiave: ogni elemento della mappa deve essere associato a una chiave univoca. La mappa è rappresentata come albero, quindi la ricerca di un elemento nella mappa è n * log (n). Questo contenitore è sempre ordinato, ecco perché aggiungere e rimuovere elementi potrebbe causare più tempo: l'albero (la struttura dati) è binario ed equilibrato.

multimap - quasi uguale a std :: map, ma consente coppie con le stesse chiavi. Ad esempio, un multimap potrebbe contenere elementi: (666, "alabala"), (666, "asdfg"), mentre lo standard std :: map non può. Questo contenitore è anche ordinato.

multiset - di nuovo - uguale a quello impostato, ma con elementi ripetibili. set - beh, questo è sempre un contenitore STL ordinato. Ad esempio, un set è {1, 2, 3} e quando si tenta di aggiungere "1" a questo set, non verrà aggiunto, poiché già esiste un tale elemento. (è analogico al set della matematica). Quindi, il multiset consente diversi elementi con lo stesso valore, ad esempio {1, 1, 1, 2, 3, 4, 4, 4} è un multiset corretto, mentre è non un set. Aggiungere e rimuovere elementi in std :: set è ancora tempo logaritmico, poiché è rappresentato da un albero binario, ordinato e bilanciato.

priority_queue - il suo primo elemento è sempre il più grande degli elementi in esso contenuti, secondo alcune rigorose condizioni di ordine deboli. Funzionalità di base: push_back e pop_back.

queue - Struttura FIFO - First in, first out. (o lo stesso di LILO - Last In - Last Out). È analogo a una coda standard: quando vai in un negozio e inizi ad aspettare in coda, il primo sarà il primo ad andare. Puoi solo push_back e pop_front. Contenitore non ordinato

set - L'ho già descritto nella sezione multiset.

stack - LIFO - Last In - First Out - Stack. Funzionalità di base - push_back, pop_back. Contenitore non ordinato

vector - analogico a un array C++ standard. Viene trattato come un array regolare, è continuo alla memoria e può essere passato a un programma C (passando l'indirizzo del primo elemento). Contenitore non ordinato

NOTA IMPORTANTE: Ho descritto la funzionalità di base, non quella completa. Leggi CPlusPlus.com per ulteriori informazioni.

+2

Non so come sono andate le cose nel 2010, ma oggigiorno vedo le persone che consigliano di usare [cppreference.com] (http://en.cppreference.com/w/) invece di cplusplus.com, a causa di un sentendo che _cppreference_ ha una qualità migliore. Il link equivalente a _cppreference_ è: [Containers library] (http://en.cppreference.com/w/cpp/container) Btw, posso garantire che nessuno in questo thread stia utilizzando STL; stanno usando la libreria standard, che si è appena adattata molto alla STL. Vedi http://stackoverflow.com/questions/5205491/whats-this-stl-vs-c-standard-library-fight-all-about/5205571#5205571 –

+0

@underscore_d - sì, cppreference.com è sicuramente la fonte migliore . Non uso più cplusplus.com, è ... diciamo così, non lo consiglierei. Sono d'accordo anche per la STL e la libreria standard. –

Problemi correlati