Nach den meisten C++ Referenzen, zum Beispiel cplusplus.com, forward iterators müssen nicht zuweisbar sein (ich meine, von einem lvalue deferenziert). Doch für einige STL-Algorithmen, die Werte schreiben müssen, zum Beispiel std::fill
(auch std::generate
etc.), die Spezifikation verwendet vorwärts Iterator:STL füllen und weiterleiten Iterator
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
während die äquivalente Verhalten lvalue dereferenzieren erfordert:
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
while (first != last) {
*first = val;
++first;
}
}
Es verwendet also einen veränderlichen Vorwärtsiterator mit einem einzigen Durchlauf.
Nun die Fragen sind:
(1) Warum es nicht machen deutlich, dass die Vorwärts-Iteratoren in diesen Fällen wandelbar sind?
(2) Update: Ich fand die folgende Frage dumm: Ich habe vorübergehend vergessen, dass Ausgabe-Iteratoren Gleichheitsvergleich nicht unterstützen müssen. Die obige Frage bleibt trotzdem bestehen.
Warum Forward-Iteratoren anstelle von Ausgabe-Iteratoren für std::fill
, std::generate
usw. verwenden, während sie eigentlich nicht mehrere Durchgänge benötigen? (std::copy
braucht nur Ausgang Iteratoren, zum Beispiel. Was der Grund ist?)
'Vorwärts-Iteratoren müssen nicht zuweisbar sein', wie haben Sie das festgestellt? Ich bin mir ziemlich sicher, dass sie zuweisbar sind. –
@JesseGood Für praktische Zwecke sind sie fast immer zuweisbar, aber wenn Sie die Referenz http://cplusplus.com/reference/iterator/ForwardIterator/?kw=forward%20iterator lesen, ist es nicht. – 4ae1e1
@JesseGood Ich fand auch das auf SO: http://StackOverflow.com/Questions/14058642/are-forward-iterators-output-iterators – 4ae1e1