Gibt es für Iteratoren wie die, die von std::back_inserter()
zurückgegeben werden, etwas, das als "End" Iterator verwendet werden kann?"end()" Iterator für Back Inserter?
Dies scheint ein wenig zunächst unsinnig, aber ich habe eine API, die:
template<typename InputIterator, typename OutputIterator>
void foo(
InputIterator input_begin,
InputIterator input_end,
OutputIterator output_begin,
OutputIterator output_end
);
foo
führt eine Operation an der Eingangssequenz, um eine Ausgangssequenz zu erzeugen. (Wer ist Länge ist auf foo
bekannt, aber möglicherweise nicht an die Eingangssequenz der Länge gleich sein.)
Die Einnahme des output_end
Parameter der ungerade Teil ist: std::copy
tut dies nicht, zum Beispiel, und vorausgesetzt, dass Sie‘ Ich werde es nicht Müll übergeben. foo
tut es, um Reichweitenprüfung zur Verfügung zu stellen: Wenn Sie einen Bereich zu klein übergeben, löst es eine Ausnahme im Namen der defensiven Programmierung aus. (Anstatt potentiell zufällige Bits im Speicher zu überschreiben.)
Nun sage ich, dass ich foo
einen Back-Inserter übergeben möchte, insbesondere einen aus einem std::vector
, der keine Begrenzung außerhalb von Speicherbeschränkungen hat. Ich brauche immer noch einen "Ende" Iterator - in diesem Fall etwas, das niemals gleich wird. (Oder, wenn ich eine std::vector
aber mit einer Beschränkung auf Länge hätte, vielleicht könnte es manchmal gleich vergleichen?)
Wie gehe ich dabei vor? Ich habe die Möglichkeit, foo
API zu ändern - ist es besser, nicht den Bereich zu überprüfen, und stattdessen eine alternative Möglichkeit, den erforderlichen Ausgabebereich zu erhalten? (Was sowieso für Raw-Arrays benötigt wird, aber nicht für Back-Inserter in einen Vektor benötigt wird.) Dies scheint weniger robust zu sein, aber ich bemühe mich, das "Robuste" (oben) zu arbeiten.
Dies ist ein vernünftiger Ansatz. Ich hatte nicht daran gedacht, in jeder Iteration zu überprüfen, ob 'out_it == out_end', anstatt die Entfernung zu berechnen. Wenn der Algorithmus so modifiziert werden könnte, dass die zwei Ausgabe-Iteratoren unterschiedlichen Typs sein können (unter Verwendung von zwei Vorlagenparametern), könnte dies einfacher gemacht werden, indem einfach ein Iterator "back_inserter_end" verwendet wird, der im Vergleich mit einem Iterator ungleich ist. Das würde viel weniger Code machen, ist aber möglicherweise unordentlicher. Ich denke immer noch nicht, dass eine Bereichsüberprüfung wie diese eine großartige Idee ist, aber wenn es wirklich gewünscht wird, ist dies ein guter Weg, dies zu erreichen! –
@James: Das 'back_inserter_end'-Iterator klingt verlockend ... Wäre schön, wenn alle Iteratoren einen "NULL" -Wert wie Zeiger hätten, da dieser Wert dann verwendet werden könnte, anstatt einen separaten Typ zu benötigen. Naja. –
Das sind alles ausgezeichnete Antworten, und ich wünschte, ich könnte "Accepted Answer" auf mehr als eine Sache markieren. Ich habe deine geupdated (obwohl ich wünschte, ich könnte es +2), aber ich gebe James die Angenommene Antwort, da das die Lösung ist, mit der ich gehe. (Dies wird eine Bibliothek sein, also bin ich mir nicht sicher, ob ich das in einer externen API offenlegen soll). Das war definitiv informativ und interessant - danke, dass du dir die Zeit genommen hast, es zu posten. – Thanatos