Sentinel ermöglicht dem End-Iterator einfach einen anderen Typ.
Die zulässigen Operationen für einen UI-Iterator sind begrenzt, dies spiegelt sich jedoch nicht in seinem Typ wider. Es ist nicht in Ordnung *
ein .end()
Iterator, aber der Compiler wird Sie lassen.
Ein Sentinel hat keine unäre Dereferenz, oder ++
, unter anderem. Es ist im Allgemeinen so beschränkt wie die schwächsten Iteratoren, die nach dem End-Iterator liegen, aber zur Kompilierungszeit durchgesetzt werden.
Es gibt eine Belohnung. Oft ist es einfacher, den Endzustand zu erkennen, als ihn zu finden. Mit einem Sentinel kann ==
senden "zu erkennen, ob das andere Argument über das Ende hinaus ist" zur Kompilierzeit anstelle der Laufzeit.
Das Ergebnis ist, dass ein Code, der früher langsamer war als das C-Äquivalent, jetzt auf die Geschwindigkeitsstufe C kompiliert, z. B. durch Kopieren einer nullterminierten Zeichenfolge unter Verwendung von std::copy
. Ohne Sentinels musstest du entweder scannen, um das Ende vor der Kopie zu finden, oder Iteratoren mit einem Bool-Flag mit der Aufschrift "Ich bin der Endwächter" (oder gleichwertig) übergeben und es unter ==
überprüfen.
Es gibt andere ähnliche Vorteile beim Arbeiten mit zählbasierten Bereichen.Darüber hinaus werden einige Dinge wie zip-Bereiche leichter auszudrücken (die End-Zip-Sentinel könnte beide Quellen Sentinels halten, und die Rückgabe gleich, wenn entweder Sentinel tut: Zip Iteratoren entweder nur den ersten Iterator vergleichen oder beide vergleichen). Ein anderer Weg darüber nachzudenken besteht darin, dass Algorithmen dazu neigen, nicht den vollen Reichtum des Iterator-Konzepts für den als den letzten Iterator übergebenen Parameter zu verwenden, und dieser Iterator wird in der Praxis sehr unterschiedlich gehandhabt. Sentinel bedeutet, dass der Aufrufer diese Tatsache ausnutzen kann, was wiederum dem Compiler ermöglicht, sie leichter auszunutzen.
Ein zip Bereich ist, was Sie bekommen, wenn Sie mit zwei oder mehr Bereiche, und „zip“ sie zusammen wie ein Reißverschluss beginnen. Der Bereich liegt nun über Tupel der einzelnen Bereichselemente. Durch Fortschreiten eines Zip-Iterators wird jeder der "enthaltenen" Iteratoren und dito für Dereferenzierung und Vergleich vorangetrieben.
Was ist ein Zip-Bereich? – Walter
@walter hinzugefügt Fußnote – Yakk
Hmm. Aber ein Zip-Iterator kann kein RandomAccessIterator sein, denn seine' Referenz' ist nicht identisch mit 'Wert_Typ &' möglicherweise nicht funktioniert (wie Sie [selbst] gesagt haben (http://stackoverflow.com/a/32871002/1023390)) Also, was ist es gut für? – Walter