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?
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?
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 []
.
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/ –
@AnishaKaul, questo perché per * default * è, 'template
Ok, grazie, il contenitore può essere cambiato! Belle. Il contenitore predefinito di Vector è un array dinamico creato da nuovo? –
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.
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. –
@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
@ArunMu In realtà per stack mi riferivo al "contenitore" chiamato stack. –
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++).
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. –
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 per ** il ** punto importante. L'STL contiene diversi ** adattatori per container ** che non rispettano i requisiti generali dei contenitori perché ... non lo sono. –
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.
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. –
Il contenitore predefinito di stack è un deque - 'class Container = deque'. –
@Jesse qualche link per supportarlo? E qual è il contenitore predefinito del vettore? –
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. –