2016-12-28 3 views

Antwort

6

Weil std::unique (durch Verschieben) die Elemente im Bereich [first, last] ändert, die durch die Zuweisungszuweisung übergeben werden. Das bedeutet, dass der Typ des dereferenzierten Iterators die Anforderungen von MoveAssignable erfüllen muss.

Typ Anforderungen

  • ForwardIt müssen den Anforderungen der ForwardIterator erfüllen. Die Art des dereferenzierten ForwardIt muss die Anforderungen von MoveAssignable erfüllen.

Aber der Iterator von std::multiset ist const iterator (da C++ 11), die nicht die Anforderung nicht erfüllt. Das deferenzierte Element kann nicht über sie verschoben werden.

+0

Ich suche [hier] (http://en.cppreference.com/w/cpp/container/multiset) und Pre-C++ 11 'Iterator' war nicht konstant. Wie hat das funktioniert? – LogicStuff

+1

@LogicStuff pre-C++ 11 Die Reihenfolge der Elemente könnte geändert werden, daher könnten Sie 'std :: unique' anwenden. – paweldac

+0

@LogicStuff Wenn mein Speicher korrekt ist, ist der Standard nicht klar genug ; einige Implementationen erlauben es, manche nicht. – songyuanyao

2

std::multiset ist intern sortiert Container, std::unique verändert Elementpositionen im Container. std::unique verwendet container::iterator_type in seinen Implementierungen und aufgrund der Tatsache, dass die Struktur von std::multiset ist streng, es hat nur const_iterator_type. Daher kann std::unique nicht auf std::multiset Typ angewendet werden.

Bevor C++ 11 eingeführt wurde interne Struktur von std::multimap könnte geändert werden, so std::unique könnte auf solche Container angewendet werden.

2

std::unique entfernt keine sich wiederholenden Werte aus dem Bereich. Stattdessen werden sie an das Ende des Bereichs verschoben (durch Vertauschen zweier Elemente in der Eingabesequenz). In std::multiset und anderen assoziativen Containern wird die Reihenfolge der Elemente durch das Sortierprädikat definiert und kann vom Benutzer nicht geändert werden. Diese Beschränkung wird erreicht, indem der nicht-konstante Iterator std::multiset etwas ähnlich zu seinem const_iterator gemacht wird (d. H. Sie können ein Element eines std::multiset nicht durch seinen nichtkonstanten Iterator modifizieren).

Verwandte Themen