STL
-
in der Firma wo ich Praktikum gemacht habe, die haben alle Funktionen
selber geschrieben. Aber ich könnte mir vorstellen , dass man z.b.
irgendwelche Funktionen noch dazu haben will.Wie ist es z.B. beim Stack . mit stack.pop() kann ich das oberste
Element zwar runterholen, aber mit cout<<stack.pop() funktioniert das nicht.
Wie kann ich meinen stack dann ausgeben ? außer empty,size,top,push,pop
gibt es keine funktionen
-
Sorry. Es geht wohl mit stack.top();
-
aber z.B. könnte man die Mitte oder das unterste Element ausgeben wollen.
Diese Funktionalität fehlt beim STL stack
-
blurry333 schrieb:
aber z.B. könnte man die Mitte oder das unterste Element ausgeben wollen.
Diese Funktionalität fehlt beim STL stacknein, die fehlt nicht - deshalb ist es ein stack... : D
-
Ein stack ist ein stack. Da packt man oben was drauf und nimmt es oben wieder runter. Der stack ist wie queue eigentlich gar kein richtiger Container, sondern ein Wrapper. Das gleiche kannst du auch mit deque machen. Du machst blos mit dem Wort stack deutlich, dass es um einen Stapel geht, von dem Du niemals was von unten rausziehst.
Wenn Du oben und unten Elemente rein&raus nehnmen willst, ist std::deque das richtige. Für Elemente in der Mitte list.
-
unskilled schrieb:
das der stack hier über eine deque implementiert wird, würde ich raten - macht aber imho nicht all zu viel sinn^^
Wieso nicht? Ich nehme an, die Standardmenschen haben sich schon was dabei überlegt und sind zum Schluss gekommen, dass in den meisten Fällen eine
std::dequeschneller ist, weil sie gleich mehrfach allokieren und deallokieren kann. Ausserdem ist der Overhead durch Verkettungszeiger geringer..filmor schrieb:
std::list würde ich in den allermeisten Fällen eh die Finger von lassen, fast immer ist ein normaler std::vector schneller.
std::listfinde ich vor allem sehr praktisch, wenn Zeiger, Referenzen und Iteratoren auf Elemente gültig bleiben sollen. Sie kann sich auch bewähren, weil man schnell Elemente in der Mitte (z.B. beim Durchiterieren) löschen kann. Allerdings sollte man im Normalfall davon absehen,std::listfür relativ kleine Objekte zu verwenden.
-
vorteile sind wohl, dass nicht umkopiert werden muss und speicher freigegeben werden kann, der nicht mehr verwendet wird - ich würd vrmtl trotzdem den vector bevorzugen, da er doch wieder schneller ist - und wenn der zu speichernde typ nicht unendlich groß ist, machts auch nichts aus, wenn man die paar byte die ganze zeit allokiert lässt...
bb
-
Ich verstehe deinen Post nicht. Ich habe ja bereits Vorteile erwähnt, wieso also "Vorteile sind wohl..."? Und warum "ich würd vrmtl trotzdem den vector bevorzugen, da er doch wieder schneller ist"? Sowas kannst du doch nicht pauschal sagen.
-
also allokationen (und deallokationen) wird die deque mind. genau so viele haben, wie der vector
bei der vector-version muss nur umkopiert werden, wenn man davor das reserve vergessen hat bzw. nicht machen konnte, weil man sich nicht sicher sein konnte, wie groß das ganze sein wird...
jz wieder: wenn das objekt nicht unendlich groß ist, kann man halt rel. viel reservieren ohne, dass es jmd stört...
wenn das nicht möglich ist, sollte man halt doch die deque nehmen^^bb
-
Ah okay, ich dachte, du würdest dich auf
std::list(meinen ersten Abschnitt) beziehen. Aber du meinst jastd::stack.
Ich habe vorher eher
std::dequeim Gegensatz zu einerstd::listgemeint. Anstd::vectorhabe ich hier gar nicht gedacht (wohl, weil er zustd::queuenicht kompatibel ist und ich die Adapter aufgrund fehlender Flexibilität sehr selten verwende).Ich kann mir vorstellen, dass ein
std::stackfähig sein soll, schnell die Grösse zu ändern, ohne viel Speicher zu verschwenden. Vielleicht liegt einem auch etwas daran, dass alle Operationen ungefähr gleich lange dauern (beimstd::vectorgeht wohl viel mehr Zeit verloren, wenn eine Reallokation bei grossen oder vielen Objekten fällig ist). Andererseits kann es gerade durch Grössenschwankungen sinnvoll sein, etwas Speicher vorrätig zu haben.Aber das sind eigentlich nur Spekulationen. Vielleicht wurde auch eine Münze geworfen.
