Legen Sie in eine STL-queue using std::copy
Ich gerne verwenden würde std::copy
zum einfügen von Elementen in einer Warteschlange, wie diese:
vector<int> v;
v.push_back( 1 );
v.push_back( 2 );
queue<int> q;
copy( v.begin(), v.end(), insert_iterator< queue<int> >( q, q.front() ) );
Aber diese nicht kompiliert werden kann, und beschwert sich, dass begin
ist nicht Mitglied der std::queue
.
Hinweis: ich habe versucht, es mit std::inserter
zu - dies auch nicht, dieser Zeit sagen, dass 'Referenz' ist nicht ein Mitglied von 'std::queue'. std::back_inserter
und std::back_insert_iterator
auch Fehler mit dem gleichen Fehler.
Übersehe ich etwas offensichtliches, oder tun insert_iterator
s nur nicht arbeiten mit Warteschlangen?
InformationsquelleAutor der Frage Andy Balaam | 2009-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider
std::queue
'passt' die bekannte Funktion alspush_back
nurpush
was bedeutet, dass die standard -back_insert_iterator
funktioniert nicht.Wohl der einfachste Weg (wenn auch konzeptionell hässlich), ist die Anpassung des container-adapter mit einem kurzen lebte container adapter adapter[sic] (eugh!) dass das Leben so lange als back-insert-iterator.
Wie folgt verwendet:
InformationsquelleAutor der Antwort CB Bailey
Queue nicht erlauben iteration durch seine Elemente.
Aus der Die SGI-STL-Docs:
Du kann diese Arbeit machen, aber Sie nicht Verwendung
insert_iterator
. Haben Sie etwas zu schreiben wiequeue_inserter
stellt eine iterator-Schnittstelle.Update ich konnte mir nicht helfen und deicded zu versuchen, den iterator, die Sie benötigen. Hier sind die Ergebnisse:
Dies funktioniert gut für Funktionen wie diese:
Aber es funktioniert nicht mit dem STL-Kopie, da die STL ist dumm.
InformationsquelleAutor der Antwort Frank Krueger
std::queue
nicht einen container in der STL Sinn, es ist ein container adapter mit sehr eingeschränkter Funktionalität. Für das, was Sie zu benötigen scheinen entwederstd::vector
oderstd::deque
("double-ended-queue, die eine "real-container"), scheint die richtige Wahl.InformationsquelleAutor der Antwort sbi
Ich bin mir ziemlich sicher, dass es einfach nicht funktioniert -- eine Warteschlange stellt
push
aber ein insert-iterator erwartet, dass die Verwendungpush_front
oderpush_back
. Es gibt keinen wirklichen Grund, Sie konnte nicht schreiben Sie Ihre eigenenpush_insert_iterator
(oder was auch immer Namen, den Sie bevorzugen), aber es ist ein bisschen Schmerz...InformationsquelleAutor der Antwort Jerry Coffin
insert_iterator
undback_insert_iterator
nur arbeiten an Behältern (oder Adapter) mit (jeweils)insert
undpush_back
Methoden -queue
nicht diese. Sie konnte schreiben Sie Ihre eigene iterator-Anlehnung an diese, so etwas wie dieses:Sei denn, eine solche Sache, die bereits existiert, aber ich bin mir ziemlich sicher, dass es nicht.
InformationsquelleAutor der Antwort Mike Seymour
Was Sie brauchen, ist ein
push_inserter
(d.h. einen inserter, der führtpush
es in der Warteschlange). Soweit ich weiß, gibt es keine solche Iteratoren in der STL. Was ich normalerweise tun ist, leider fallen zurück in die gute alte for-Schleife.Wenn Sie den Mut haben, können Sie Rollen Sie Ihre eigenen iterator, etwas entlang diesen Linien:
Dies ist nur ein Entwurf, aber Sie bekommen die Idee. Funktioniert mit jedem Behälter (oder container-Adapter) mit einem
push
Methode (z.B.queue
stack
).InformationsquelleAutor der Antwort Luc Touraille
std::queue
ist nicht eines der grundlegenden Container in STL. Es ist ein container-Adapter ist gebaut mit eine der grundlegenden STL-Container ( in diesem Fall einer der sequenziellen container entwederstd::vector
std::deque
oderstd::list
). Es ist speziell für den FIFO-Verhalten und nicht von zufälliger insertion an der gegebenen iterator, die Sie wollen, für dieinsert_iterator
zu arbeiten. Daher wird es nicht möglich sein queue wie diese.Der einfachste Weg, woran ich denken konnte, dies zu tun ist, um:
Und verwenden Sie es wie:
InformationsquelleAutor der Antwort Naveen
In diesem einfachen Fall kann man schreiben:
Dadurch wird eine Kopie der
vector
und verwenden Sie es als die zugrunde liegenden container derqueue
.Natürlich, dieser Ansatz wird nicht funktionieren, wenn Sie brauchen, um enqueue-Sachen nach der Warteschlange konstruiert wurde.
InformationsquelleAutor der Antwort Thomas