Nach der C ++ - Referenz soll set :: insert ein Paar zurückgeben, bei dem der Iterator entweder auf das neu eingefügte Element oder auf das vorhandene Element zeigt, falls ein solches existiert.
Aber ich habe ein Problem damit, dem Iterator zuzuordnen, wie dieses einfache Beispiel zeigt:
%Vor%Ich habe versucht, G ++ und Clang und keiner funktioniert.
%Vor%Ich kann nichts in der Dokumentation finden, das anzeigt, dass der Iterator auf ein konstantes Objekt verweisen sollte, und nichts in der Typ-Signatur würde dies ebenfalls anzeigen. Kann mir jemand helfen zu verstehen, warum das nicht funktioniert?
Für std::set
sind beide zugehörigen Typen iterator
und const_iterator
konstant bidirektional Iteratoren. Der Grund dafür ist, dass std::set
geordnet ist. Wenn Sie ein Element der Menge durch einen Iterator verändern würden, würden Sie diese Reihenfolge brechen.
Betrachten Sie std::set
mit den bestellten Elementen {1, 4, 8}
. Wenn Sie dann etwas wie *set.insert(5).first = 10;
(wenn es erlaubt wäre) gemacht hätten, würde zuerst 5
eingefügt, um {1, 4, 5, 8}
zu erhalten, und dann würde das eingefügte Element auf 10
gesetzt werden, um {1, 4, 10, 8}
zu erhalten. Die Ordnungsinvariante wurde jetzt gebrochen.
Da Sie 5
mit insert(5)
einfügen, gibt es keinen Grund, den Iterator zu dereferenzieren und ihm 5
zuzuweisen.
Sie können die Elemente eines Satzes nicht ändern. Es ist ein bestellter Container. Seine Iteratoren sind nicht zuweisbar.
In C ++ 11 beziehen sich Set-Iteratoren auf const
types (siehe Referenz setzen ). Wenn Sie darüber nachdenken, macht es Sinn, wenn ein Set sein Element geordnet speichert und ein einfaches Ändern eines bestimmten Elements höchstwahrscheinlich die Ordnungsbeschränkungen verletzen würde.