2013-12-16 5 views
5

Meine Frage ist teilweise durch this question motiviert.Ist es möglich, STL-Algorithmen ohne einen Zwischenbehälter zu komponieren

Gibt es eine Möglichkeit, STL-Algorithmen oder benutzerdefinierte Algorithmen ohne Zwischenbehälter zu erstellen? Eine Antwort kann ein Tool von Boost verwenden, aber angenommen, die zusammengesetzten Algorithmen sind benutzerdefiniert oder aus der STL.

So boost::adaptors::reversed zählt nicht, da der Umkehralgorithmus in Boost ist.

+0

Welche Annahme über die Algorithmen Benutzer oder von der STL schließt die gegebene Antwort aus? – polkadotcadaver

+0

@PaulDraper Hat das nicht gesagt, als ich den Kommentar geschrieben habe :) – polkadotcadaver

+0

"Meine Frage ist teilweise von dieser Frage motiviert." - Wie ist das * teilweise motiviert * und kein Duplikat? –

Antwort

7

Nr

Lasst uns sagen f und g STL-Algorithmen sind.

Lassen Sie uns sagen, was Sie wollen, ist f(g(x)) (ich versuche, die Idee hier zu vermitteln ...).

Es gibt keine Möglichkeit, einen Zwischenbehälter zu haben, da das Ergebnis g(x) ein Behälter sein muss.

Wenn Sie Zwischencontainer vermeiden möchten, müssen Sie Algorithmen verwenden, die andere Algorithmen wie "Boost.Range adaptors" (z. B. boost::adaptors::reversed) "inspizieren" oder interagieren können. B. f ist "sort" und g ist "reverse". Boost's Adapter könnten herausfinden, dass der umgekehrte Schritt ein No-Op ist und überspringen. STL-Algorithmen könnten das nicht, da es für diese Informationen keine Möglichkeit gibt, es zu schaffen.

+0

Also gibt es keinen "Adapter Adapter", der 'std :: reversed' in eine Art 'boost :: adapter :: reversed' verwandeln kann? Ich würde nicht für jeden unabhängigen Algorithmus, den ich haben könnte, einen Wrapper neu schreiben müssen. – Polymer

+0

@Polymer, ich bin mir nicht sicher über das Umschreiben eines Wrappers; Ich denke du würdest einen Boost :: Adaptors kompatiblen Algorithmus schreiben. Aber die Antwort ist ja, Sie können nicht "verdecken" (?) "Std :: reversed" zu "boost :: adapter :: reversed" –

+0

Convert ist ein besseres Wort, danke. – Polymer

1

Ja für Algorithmen, die mit Eingabe- und Ausgabe-Iteratoren kompatibel sind.

Es erfordert Threads zum Speichern des Ausführungsstatus oder etwas Coroutine wie.

Jeder Schritt schreibt in einen Ausgabe-Iterator, der die Ausführung stoppt und den nächsten Algorithmus ausführt. In ähnlicher Weise stoppt das Lesen von dem nächsten Eingabewert diesen Ausführungs-Thread und wartet darauf, dass er bereit ist.

Viele <algorithms> passen nicht zu den obigen Einschränkungen. Aber diejenigen, die das tun, sollten ihre Anforderungen dokumentieren. transform qualifiziert, kann ich nicht von anderen von meinem Kopf denken.

+0

Das ist eine wirklich interessante Antwort. Lass mich sehen, ob ich es verstehe. Sie haben einen Deferred Execution-Iterator, den wir 'defIter' nennen. Sein Konstruktor akzeptiert einen Algorithmus (mit einer Schnittstelle, die Eingabe-Iteratoren akzeptiert). Wir schreiben einen Algorithmus, der '[inA, inB)' verwendet und an '[outA, outB)' ausgibt, wobei 'inA, inB' Eingabe-Iteratoren und' outA, outB' Ausgabe-Iteratoren sind. Der "komponierte" Code würde in etwa wie folgt aussehen: "erster_Algorithmus (inA, inB, defIter {zweiter_Algorithmus, outA, outB})". "second_algorithm" würde von Eingabe-Iteratoren lesen, die die Ausführung zurück zu "first_algorithm" zurückliefern würden. – Polymer

+0

@Polymer Yep, das klingt grundsätzlich richtig. Wenn Sie irgendeine Art von C++ - Coroutine-Erweiterung haben, könnten Sie es sogar in einem Thread tun, da der Mangel an Pufferung bedeutet, dass wir sowieso single-threaded sind: das Threading existiert einfach, um die Verarbeitung von second_algorithm an einem Punkt zu stoppen wo es wirklich nicht beabsichtigt zu stoppen (beim Lesen von seinem Eingang). Beachten Sie, dass "defIter" in einen einzelnen Ausgabe-Iterator ausgegeben würde, nicht 2. – Yakk

+0

Ihr Recht, es würde nur zu einem Iterator ausgeben! Bevor ich versuche, diesen Iterator zu implementieren, gibt es irgendetwas in Boost oder eine andere Bibliothek, die so etwas bietet? – Polymer

Verwandte Themen