2012-01-09 8 views
14

Entrambi si comportano come una pila. Entrambi hanno operazioni push e pop.Qual è la principale differenza tra un vettore e uno stack?

La differenza in alcuni layout di memoria?

+0

Il contenitore predefinito di stack è un deque - 'class Container = deque '. –

+0

@Jesse qualche link per supportarlo? E qual è il contenitore predefinito del vettore? –

+0

Ecco un collegamento a [MSDN] (http://msdn.microsoft.com/en-us/library/56fa1zk5%28v=VS.100%29.aspx). Dovresti anche ottenere una [copia pdf della bozza standard C++] (http://www.open-std.org/jtc1/sc22/wg21/) che contiene le definizioni. Il vettore è uno dei contenitori standard di stl, lo stack è una specializzazione * che utilizza uno * dei contenitori standard. –

risposta

11

std::vector ha diverse operazioni di accessibilità e modifica rispetto a std::stack. In caso di std::stack, potrebbe essere necessario eseguire le operazioni solo in modo sistematico, dove è possibile push() sopra l'ultimo elemento o pop() l'ultimo elemento.

std::vector è più flessibile in tal senso, in cui ha diverse operazioni, dove è possibile insert() in mezzo o erase() in mezzo.

Il punto principale è che, std::stack deve essere fornito il contenitore sottostante. Per impostazione predefinita è std::deque, ma può anche essere std::vector o std::list.
D'altra parte, è garantito che std::vector sia un array contiguo a cui è possibile accedere utilizzando operator [].

+0

Hai detto: "Il punto principale è che, std :: stack deve essere fornito il contenitore sottostante. Ma questo esempio non mostra alcuno sforzo aggiuntivo per fornire un contenitore? http://www.cplusplus.com/reference/stl/stack/push/ –

+2

@AnishaKaul, questo perché per * default * è, 'template > stack di classi;'. Quindi, se non si fornisce alcun contenitore, si presuppone che sia 'std :: deque'. Vedi il link che ho postato in risposta per maggiori informazioni. – iammilind

+0

Ok, grazie, il contenitore può essere cambiato! Belle. Il contenitore predefinito di Vector è un array dinamico creato da nuovo? –

7

stack è uno stack. Può solo spingere e scoppiare. Un vector può fare altre cose, come l'inserimento nel mezzo. Ciò aumenta la flessibilità, ma riduce le garanzie.

Ad esempio, per una pila, se si preme A e poi B sul retro, si ha la garanzia che verranno rimossi nell'ordine B, quindi A. vector non lo garantisce.

+0

Esatto, ho appena visto che il vettore ha una funzione di 'cancellazione' che può essere cancellata dai medi. Stack non ha nulla del genere. :) Quindi, il vettore è una pila flessibile. –

+0

@Anisha: No, è un modo sbagliato di assumere. Se questo dovesse essere il caso, una lista di link, un array semplice, una deque possono essere tutti chiamati stack ... rt? Ma stack è un insieme di proprietà definite per un contenitore o una struttura dati. È possibile creare uno stack fuori dalla struttura dati sopra menzionata se l'implementazione rimane vera per le proprietà definite per uno stack. – Arunmu

+0

@ArunMu In realtà per stack mi riferivo al "contenitore" chiamato stack. –

2

Lo stack è fondamentalmente un caso speciale di vettore. Il vettore teoricamente può crescere come desideri. È possibile rimuovere elementi in qualsiasi indice in un vettore. Tuttavia, in caso di stack è possibile rimuovere elementi e inserirli solo nella parte superiore (quindi un caso speciale di vettore).

Di fronte a molte librerie che forniscono un'implementazione di uno stack, generalmente ereditano dalla classe/struttura vettoriale. Non sono sicuro, ma penso che lo faccia STL (C++).

+0

L'STL è una cosa vecchia; probabilmente intendi la libreria standard. E no, il suo 'stack' non è definito come ereditato da' vector'; si tratta di un adattatore basato su modelli che ha come valore predefinito 'deque' e per il quale è possibile scegliere un' vector' come opzione. –

11

Non sono a conoscenza di tutti i dettagli di implementazione, ma in base allo this, stack è un adattatore contenitore. Si assicura che il contenitore sottostante, che può essere un vettore, elenco o deque, funzioni come una pila, cioè consente solo push e pop, e non accesso casuale.

Quindi, un vettore può funzionare come una pila, ma una pila non può funzionare come un vettore, perché non è possibile inserire o ottenere un elemento in una posizione casuale.

+1

+1 per ** il ** punto importante. L'STL contiene diversi ** adattatori per container ** che non rispettano i requisiti generali dei contenitori perché ... non lo sono. –

0

Penso che la differenza principale sia che il vettore è un contenitore basato su intervallo. Può essere facilmente utilizzato grazie alle sue funzioni membro come inizio e fine. Il vettore può essere facilmente avviato con il modulo {}. Possiamo usare le nuove funzionalità del moderno C++ come loop basati sulla gamma.

vector<int> vec{ 7, 3, 1, 9, 5 }; 
for (auto &i : vec) { 
    std::cout << i << std::endl; 
} 

considerando che non è possibile per std :: stack.

+0

Ma le persone che scelgono di usare 'std :: stack' sanno già che non si preoccupano dell'iterazione basata sull'intervallo; piuttosto, vogliono un'interfaccia concisa per spingere e popare gli elementi in un ordine ben definito. –

Problemi correlati