2010-10-06 17 views
21

Cosa sono i contenitori/adattatori ?Cosa sono i contenitori/adattatori? C++

Qualcuno si prega di spiegare in lingua laico.

Ho cercato di cercare su internet ma le definizioni e le spiegazioni sono troppo tecniche e difficili da capire.

Ho una conoscenza di base di C++ e dei suoi sottotemi come (classe/templates/STL).

EDIT 1:

Qualcuno può per favore mi dia un esempio pratico di applicazione di contenitori/adattatori?

Solo per una migliore comprensione :-)

Grazie.

+1

Ho difficoltà a vedere cosa intendi con "un esempio pratico"; Ho difficoltà a provare a pensare a un momento in cui non dovresti usare un contenitore (che si tratti di un container di STL o di uno di Boost o di uno che implementa tu stesso). Praticamente ogni volta che hai una collezione di oggetti che usi un contenitore ... –

+0

@James McNellis - Con l'esempio pratico intendevo un esempio di qualsiasi ambiente in cui è stato applicato. Ma comunque, ho capito il tuo punto.I Posso essere fraseggio la mia domanda erroneamente. Grazie. – Pavitar

risposta

47

<joke> C++ è tecnica e difficile da comprendere :-D </joke>

I contenitori sono tipi di dati da STL che può contenere dati.

Esempio: vector come un array dinamico

adattatori sono i tipi di dati da STL che si adattano un contenitore per fornire un'interfaccia specifica.

Esempio: stack fornendo un'interfaccia pila sopra del contenitore scelto

(lato nota: entrambi sono in realtà modelli non tipi di dati, ma la definizione sembra meglio così)

+0

non può essere più succinto di quello –

+3

+1 per succinto. Hai decisamente battuto la mia risposta per una concisione :-) –

+0

+1 ... Grazie, controlla EDIT 1 – Pavitar

6

La definizione tecnica di "contenitore "da The SGI STL documentation è piuttosto buono:

Un contenitore è un oggetto che memorizza altri oggetti (i suoi elementi) e che ha metodi per accedere ai suoi elementi. In particolare, ogni tipo che è un modello di Container ha un tipo di iteratore associato che può essere utilizzato per iterare attraverso gli elementi del Container.

Quindi, un contenitore è una struttura di dati che contiene ("contiene") una raccolta di oggetti di qualche tipo. L'idea chiave è che ci sono diversi tipi di contenitori, ognuno dei quali memorizza gli oggetti in un modo diverso e offre caratteristiche di performance diverse, ma tutti hanno un'interfaccia standard in modo che sia possibile scambiarne uno con un altro facilmente e senza modificare troppo del codice che utilizza il contenitore. L'idea è che i contenitori siano progettati per essere intercambiabili il più possibile.

Gli adattatori contenitore sono classi che forniscono un sottoinsieme delle funzionalità di un contenitore ma possono fornire funzionalità aggiuntive che semplificano l'utilizzo di contenitori per determinati scenari.Ad esempio, è possibile utilizzare facilmente std::vector o std::deque per una struttura di dati stack e chiamare push_back, back e pop_back come interfaccia stack; std::stack fornisce un'interfaccia che può utilizzare uno std::vector o std::deque o un altro contenitore sequenza ma fornisce le funzioni standard più push, e pop per l'accesso ai membri.

+0

+ 1.per il collegamento alla documentazione. Grazie.Per favore controlla EDIT 1. – Pavitar

50

Un contenitore è una struttura dati specifica che contiene dati, di solito in quantità illimitate. Ogni tipo di contenitore ha limitazioni su come accedere, aggiungere o rimuovere i dati in modo efficiente.

Di seguito sono riportati alcuni esempi di contenitori che utilizzano classi STL.

Sequence Container

Qui ci sono i contenitori di sequenza, il che significa che i dati siano in modo affidabile ordinata (che è, c'è un davanti e un dietro a loro. Non voglio dire che essi ordinare automaticamente se stessi!).

  • A vector è un po 'come un array di dimensioni flessibili. I vettori sono ad accesso casuale, nel senso che è possibile accedere a qualsiasi elemento con indice intero in tempo costante (proprio come un array). È possibile aggiungere o rimuovere dalla fine della matrice anche in (quasi) tempo costante. Ovunque, comunque, e probabilmente stai cercando di ricopiare potenzialmente tutti gli elementi.
  • A deque, o coda a doppio attacco, è come un vettore ma è possibile aggiungerlo in avanti o indietro. È ancora possibile accedere agli elementi in tempo costante, ma non è garantito che gli elementi di deque siano contigui in memoria come vettori o array.
  • A elenco è un elenco collegato, che indica i dati collegati tramite puntatori. È possibile accedere in modo costante all'inizio e alla fine, ma per andare da qualche parte nel mezzo è necessario scorrere l'elenco. È possibile aggiungere elementi in qualsiasi punto dell'elenco in tempo costante, tuttavia, se si dispone già di un puntatore a uno dei nodi vicini.

associativa Container

tratta di contenitori associativi, il che significa che gli elementi non ordinate ma invece hanno associazioni con l'altro utilizzato per determinare mapping unicità o:

  • Un impostare è un contenitore con elementi unici. È possibile aggiungere solo uno di ciascun elemento a un set; eventuali altre aggiunte vengono ignorate.
  • Un multiset è come un set, ma è possibile inserire più di un elemento in. Il multiset tiene traccia di quanti di ciascun tipo di elemento si trovano nella struttura.
  • A mappa, noto anche come array associativo, è una struttura in cui si inseriscono coppie chiave-valore; quindi puoi cercare qualsiasi valore fornendo la chiave. Quindi è un po 'come un array a cui è possibile accedere con un indice di stringa (chiave) o qualsiasi altro tipo di indice. (Se si inserisce un'altra coppia di valori-chiave e la chiave esiste già, poi basta sovrascrivere il valore della chiave originale.)
  • Un multimap è una mappa che consente l'inserimento di più valori per la stessa chiave. Quando esegui una ricerca chiave, recuperi un contenitore con tutti i valori in esso contenuti.

alimentatori container adattatori

Container, invece, sono interfacce create limitando funzionalità in un preesistente contenitore e una serie diversa di funzionalità. Quando si dichiarano gli adattatori contenitore, si ha la possibilità di specificare quali contenitori sequenza formano il contenitore sottostante. Questi sono:

  • Una pila è un contenitore che fornisce l'accesso Last-In, First-Out (LIFO). Fondamentalmente, rimuovi gli elementi nell'ordine inverso in cui li inserisci. È difficile arrivare a qualsiasi elemento nel mezzo. Di solito questo va in cima ad un deque .
  • Una coda è un contenitore che fornisce l'accesso FIFO (First-In, First-Out). Rimuovi elementi nello stesso ordine in cui li inserisci. È difficile arrivare a qualsiasi elemento nel mezzo. Di solito questo va in cima ad un deque .
  • A priority_queue è un contenitore che fornisce l'accesso agli elementi per l'ordine ordinato. È possibile inserire elementi in qualsiasi ordine e quindi recuperare il "più basso" di questi valori in qualsiasi momento. Le code prioritarie in C++ STL utilizzano una struttura heap internamente, che a sua volta è fondamentalmente supportata da array; quindi, di solito questo va sopra un vettore .

Vedere this reference page per ulteriori informazioni, inclusa la complessità temporale per ciascuna operazione e collegamenti a pagine dettagliate per ciascun tipo di contenitore.

+0

Non avrebbe più senso che uno stack (LIFO) ** ** si sovrapponga a un vettore *** ***, poiché cresce e si restringe solo a un'estremità, invece che a una *** deque * ** che cresce e si restringe ad entrambe le estremità? – veganaiZe

+0

@veganaiZe Non hai torto, potrebbe avere più senso in questo modo. La mia ipotesi è che la maggior parte delle implementazioni di deques potrebbe essere in grado di aumentare di dimensioni un po 'più rapidamente di quanto farebbero i vettori. Non sono sicuro, però. –

+0

Non ti sbagli neanche! La tua menzione di un * deque * è comune nella documentazione, in generale. Anche se potrebbe anche essere implementato come un elenco collegato separatamente. Ma un *** array dinamico *** sembra essere l'opzione più efficiente pur continuando a fornire gli elementi in una sequenza contigua. – veganaiZe