return iterator von std :: set :: insert () ist const? [Duplikat]

7

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?

    
drwowe 30.04.2013, 11:46
quelle

3 Antworten

13

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.

    
Joseph Mansfield 30.04.2013, 11:51
quelle
4

Sie können die Elemente eines Satzes nicht ändern. Es ist ein bestellter Container. Seine Iteratoren sind nicht zuweisbar.

    
huskerchad 30.04.2013 11:51
quelle
3

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.

    
misberner 30.04.2013 11:51
quelle

Tags und Links