std::list<T,Allocator>::unique
| (1) | ||
void unique(); |
(bis C++20) | |
| size_type unique(); |
(seit C++20) | |
| (2) | ||
template< class BinaryPredicate > void unique( BinaryPredicate p ); |
(bis C++20) | |
| template< class BinaryPredicate > size_type unique( BinaryPredicate p ); |
(seit C++20) | |
Entfernt alle *aufeinanderfolgenden* doppelten Elemente aus dem Container. Nur das erste Element jeder Gruppe von gleichen Elementen bleibt erhalten. Macht nur die Iteratoren und Referenzen auf die entfernten Elemente ungültig.
Das Verhalten ist undefiniert, wenn der entsprechende Komparator keine Äquivalenzrelation etabliert.
Inhalt |
[bearbeiten] Parameter
| p | - | binäre Prädikatfunktion, die true zurückgibt, wenn die Elemente als gleich behandelt werden sollen. Die Signatur der Prädikatfunktion sollte äquivalent zur folgenden sein: bool pred(const Type1 &a, const Type2 &b); Obwohl die Signatur nicht zwingend const & haben muss, darf die Funktion die ihr übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) |
| Typanforderungen | ||
-BinaryPredicate muss die Anforderungen an einen BinaryPredicate erfüllen. | ||
[bearbeiten] Rückgabewert
|
(keine) |
(bis C++20) |
|
Die Anzahl der entfernten Elemente. |
(seit C++20) |
[bearbeiten] Komplexität
Wenn empty() true ist, wird kein Vergleich durchgeführt.
Andernfalls, gegeben N als std::distance(begin(), end())
[bearbeiten] Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_list_remove_return_type |
201806L |
(C++20) | Änderung des Rückgabetyps |
[bearbeiten] Beispiel
#include <iostream> #include <list> std::ostream& operator<< (std::ostream& os, std::list<int> const& container) { for (int val : container) os << val << ' '; return os << '\n'; } int main() { std::list<int> c{1, 2, 2, 3, 3, 2, 1, 1, 2}; std::cout << "Before unique(): " << c; const auto count1 = c.unique(); std::cout << "After unique(): " << c << count1 << " elements were removed\n"; c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2}; std::cout << "\nBefore unique(pred): " << c; const auto count2 = c.unique([mod = 10](int x, int y) { return (x % mod) == (y % mod); }); std::cout << "After unique(pred): " << c << count2 << " elements were removed\n"; }
Ausgabe
Before unique(): 1 2 2 3 3 2 1 1 2 After unique(): 1 2 3 2 1 2 3 elements were removed Before unique(pred): 1 2 12 23 3 2 51 1 2 2 After unique(pred): 1 2 23 2 51 2 4 elements were removed
Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 1207 | C++98 | war es unklar, ob Iteratoren und/oder Referenzen ungültig werden |
macht nur Iteratoren und Referenzen auf die entfernten Elemente ungültig |
[bearbeiten] Siehe auch
| Entfernt aufeinanderfolgende doppelte Elemente in einem Bereich (Funktionstemplate) |