2016-06-03 15 views
1

Warum würde ich eine std::stack oder eine std::queue anstelle einer std::vector oder std::deque verwenden?Warum std :: stack oder std :: queue?

Da die Containeradapter lediglich Wrapper um die Standardcontainer sind, warum sollten sie überhaupt verwendet werden?

+0

Da gibt es Algorithmen, die Stacks und Warteschlangen verwenden. Warum verwenden Sie sie nicht, indem Sie versuchen, eine Liste/einen Vektor zu verwenden und all Ihre Algorithmen zu refaktorisieren? Es sei denn, ich vermisse hier etwas ernsthaft. –

+0

Nur um zu verhindern, * das Rad neu zu erfinden *. Es stimmt, dass wir alles erreichen können - aber warum etwas von Grund auf neu machen, wenn eine andere Option verfügbar ist? Außerdem könnte der von Grund auf neu entwickelte Code fehlerhaft und fehleranfällig sein. –

+0

@BatCoder: Wer schlägt vor, alles von Grund auf neu zu starten? Er bittet darum, einfach einen normalen Sequenzcontainer wie 'std :: vector' oder' std :: deque' als Stack oder Queue zu verwenden, da sie natürlich perfekt in der Lage sind, diese Funktionen zu bedienen. –

Antwort

5

To limit the user interface Sie möchten nicht, dass Ihr Stack Elemente an anderer Stelle als an der Spitze entfernen kann. Warum man einen Vektor anstelle eines Stapels verwendet, wenn man genau die gleiche Leistung hat, verbessert Stack auch die Lesbarkeit und Zuverlässigkeit.

std::stack ist expressiver als std::vector, wenn der Container, den Sie implementieren möchten, wirklich ein LIFO ist.

+0

warum teurer? –

+1

ausdrucksstark nicht teuer – Deepanshu

3
  1. Für die Bequemlichkeit. Sie bieten eine semantische API, die auf die Bedürfnisse zugeschnitten ist.

  2. Lesbarkeit. stack.top() sieht besser aus als stack[0] oder stack[stack.size()] * oder stack.back(). Der Leser eines solchen Codes muss die Bedeutung eines solchen Konstrukts nicht interpretieren. Es ist gegeben.

* Hinweis: Wie @moooeeeep vorschlagen soll es size()-1 wenn überhaupt, aber ich verlasse Original als ein schönes Beispiel, warum man gelieferten Lösungen anstelle dem Schreiben selbst einfachste Dinge von Hand verwendet werden soll.

+0

Auch der Name selbst gibt eine gute Idee, wie sie verwendet werden sollten und was sie unter der Haube tun. – Namoshek

+1

oder 'stack [stack.size() - 1]' – moooeeeep

+0

. @ Moooeeeep Oh, mein Schlechter! * blushy bearbeiten *. Übrigens ist das ein weiterer guter Grund. – luk32

1

std::stack ist ein Adapter für Container (könnte aus einem Vektor sein, eine Liste von whatsnut Container). Der Hauptzweck besteht darin, die Schnittstelle des zugrunde liegenden Containers in diejenige eines Stapels zu transformieren. So geben Sie push(), top() und pop() anstelle von push_back(), back() und pop_back().

Warteschlange und Deque folgen dem gleichen Schema. Eine Warteschlange ist eine Deque mit weniger Operationen möglich.