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?
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?
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 []
.
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/ –
@AnishaKaul, ponieważ przez * default * to jest, 'template
OK, dzięki, pojemnik można zmienić! W porządku. Domyślnym kontenerem Vector jest tablica dynamiczna utworzona przez nowy? –
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.
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. –
@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
@ArunMu Właściwie przez stos miałem na myśli "kontener" zwany stosem. –
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++).
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ę. –
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 za ** ** ważny punkt. STL zawiera kilka ** adapterów kontenerowych **, które nie spełniają ogólnych wymagań kontenerów, ponieważ ... nie są. –
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.
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. –
Domyślnym kontenerem stosów jest kontener klasy "deque -' Container = deque ". –
@Jesse wszelkie linki do obsługi tego? A jaki jest domyślny kontener wektora? –
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. –