2012-01-09 24 views
14

Oba działają jak stos. Oba mają operacje push i pop.Jaka jest główna różnica między wektorem a stosem?

Czy różnica w niektórych układach pamięci?

+0

Domyślnym kontenerem stosów jest kontener klasy "deque -' Container = deque ". –

+0

@Jesse wszelkie linki do obsługi tego? A jaki jest domyślny kontener wektora? –

+0

Oto link do [MSDN] (http://msdn.microsoft.com/en-us/library/56fa1zk5%28v=VS.100%29.aspx). Powinieneś również otrzymać [wersję pdf standardowego projektu C++] (http://www.open-std.org/jtc1/sc22/wg21/), która zawiera definicje. Wektor jest jednym ze standardowych kontenerów STL, stos to specjalizacja * przy użyciu jednego * standardowych kontenerów. –

Odpowiedz

11

std::vector ma kilka operacji związanych z dostępnością i modyfikacją w porównaniu do std::stack. W przypadku std::stack, być może będziesz musiał wykonywać operacje tylko w sposób systematyczny, gdzie możesz push() nad ostatnim elementem lub pop() ostatni element.

std::vector jest bardziej elastyczny w tym sensie, gdy ma kilka operacji, w których można między nimi wpisać insert() lub erase().

Najważniejsze jest to, że std::stack należy dostarczyć podstawowy kontener. Domyślnie jest to std::deque, ale może też być std::vector lub std::list.
Z drugiej strony gwarantuje się, że std::vector jest ciągłą tablicą, do której można uzyskać dostęp za pomocą operator [].

+0

Powiedziałeś: "Najważniejsze jest to, że std :: stack musi być zapewniony podstawowy pojemnik." Ale ten przykład nie pokazuje żadnego dodatkowego wysiłku dostarczania pojemnika? http://www.cplusplus.com/reference/stl/stack/push/ –

+2

@AnishaKaul, ponieważ przez * default * to jest, 'template > stos klas;'. Więc jeśli nie podasz żadnego kontenera, zakłada on, że jest to 'std :: deque'. Zobacz link opublikowany w odpowiedzi, aby uzyskać więcej informacji. – iammilind

+0

OK, dzięki, pojemnik można zmienić! W porządku. Domyślnym kontenerem Vector jest tablica dynamiczna utworzona przez nowy? –

7

stack to stos. Może tylko popchnąć i pop. A vector może wykonywać inne czynności, np. Wstawianie do środka. Zwiększa to elastyczność, ale zmniejsza gwarancje.

Na przykład, w przypadku stosu, jeśli naciskasz A, a następnie B z tyłu, masz gwarancję, że zostaną one usunięte w kolejności B, a następnie A. vector nie gwarantuje tego.

+0

Właśnie zobaczyłem, że wektor ma funkcję "wymazywania", którą można wymazać ze środka. Stack nie ma takich rzeczy. :) więc wektor to elastyczny stos. –

+0

@Anisha: Nie, to zły sposób na przyjęcie. Jeśli tak powinno być, lista-linków, prosta tablica, maska ​​może być nazwana stosem.rt? Ale stos to zestaw właściwości zdefiniowanych dla kontenera lub struktury danych. Możesz utworzyć stos z wyżej wspomnianej struktury danych, jeśli twoja implementacja pozostaje prawdziwa dla właściwości zdefiniowanych dla stosu. – Arunmu

+0

@ArunMu Właściwie przez stos miałem na myśli "kontener" zwany stosem. –

2

Stos to w zasadzie specjalny przypadek wektora. Teoretycznie mówiąc, wektor może rosnąć, jak chcesz. Możesz usunąć elementy z dowolnego indeksu w wektorze. Jednak w przypadku stosu można usunąć elementy i wstawić je tylko u góry (stąd specjalny przypadek wektora).

W obrębie twarzy w wielu bibliotekach, które zapewniają implementację stosu, zazwyczaj dziedziczą z klasy/struktur wektorowych. Nie jestem pewien, ale myślę, że robi to STL (C++).

+0

STL to stara rzecz; prawdopodobnie masz na myśli Bibliotekę Standardową. I nie, jego 'stack' nie jest zdefiniowany jako dziedziczący po' vector'; jest to szablonowy adapter, który domyślnie jest ustawiony na 'deque' i dla którego można wybrać" wektor "jako opcję. –

11

Nie jestem świadomy wszystkich szczegółów implementacji, ale zgodnie z this stos jest adapterem kontenera. Zapewnia to, że podstawowy pojemnik, który może być wektorem, listą lub zasobnikiem, działa jak stos, tj. Zezwala tylko na push i pop, a nie na dostęp losowy.

Tak więc wektor może działać jako stos, ale stos nie może działać jako wektor, ponieważ nie można wstawić elementu ani uzyskać go w przypadkowej pozycji.

+1

+1 za ** ** ważny punkt. STL zawiera kilka ** adapterów kontenerowych **, które nie spełniają ogólnych wymagań kontenerów, ponieważ ... nie są. –

0

Myślę, że główną różnicą jest to, że wektor jest kontenerem na bazie. Można go łatwo wykorzystać dzięki funkcjom członkowskim, takim jak początek i koniec. Wektor można łatwo zainicjować za pomocą formularza {}. Możemy korzystać z nowych funkcji nowoczesnych pętli opartych na C++.

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

Podczas gdy std :: stack nie jest możliwy.

+0

Ale ludzie decydujący się na użycie 'std :: stack' już wiedzą, że nie dbają o iterację opartą na zasięgach; chcą raczej zwięzłego interfejsu do popychania i popowania elementów w ściśle określonej kolejności. –

Powiązane problemy