std::list<T,Allocator>::unique
void unique();
|
(1) | (bis C++20) |
size_type unique();
|
(seit C++20) | |
template< class BinaryPredicate >
void unique( BinaryPredicate p );
|
(2) | (bis C++20) |
template< class BinaryPredicate >
size_type unique( BinaryPredicate p );
|
(seit C++20) | |
Entfernt alle aufeinanderfolgenden doppelten Elemente aus dem Container. Es bleibt nur das erste Element jeder Gruppe gleicher Elemente erhalten.
Nur die Iteratoren und Referenzen zu den entfernten Elementen werden ungültig.
operator== zum Vergleichen der Elemente.p zum Vergleichen der Elemente.Das Verhalten ist undefiniert, wenn der entsprechende Vergleichsoperator keine Äquivalenzrelation herstellt.
Parameter
| p | - |
binäres Prädikat, das
true
zurückgibt, wenn die Elemente als gleich behandelt werden sollen.
Die Signatur der Prädikatfunktion sollte äquivalent zu folgender sein: bool pred ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur keine
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
| Typanforderungen | ||
-
BinaryPred
muss die Anforderungen von
BinaryPredicate
erfüllen.
|
||
Rückgabewert
|
(keine) |
(bis C++20) |
|
Die Anzahl der entfernten Elemente. |
(seit C++20) |
Komplexität
Wenn empty() true ist, wird kein Vergleich durchgeführt.
Andernfalls, gegeben N als std:: distance ( begin ( ) , end ( ) ) :
Hinweise
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_list_remove_return_type
|
201806L
|
(C++20) | Ändern des Rückgabetyps |
Beispiel
#include <iostream>
#include <list>
std::ostream& operator<< (std::ostream& os, const std::list<int>& 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
Fehlerberichte
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 |
es war unklar, ob Iteratoren
und/oder Referenzen ungültig werden |
macht nur Iteratoren und
Referenzen auf die entfernten Elemente ungültig |
Siehe auch
| entfernt aufeinanderfolgende doppelte Elemente in einem Bereich (Funktionstemplate & Algorithmus-Funktionsobjekt) | |
(C++20) |