Namespaces
Variants

std::list<T,Allocator>::unique

Von de.cppreference.net

 
 
 
 
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.

1) Verwendet operator== zum Vergleichen der Elemente.
2) Verwendet 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) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1 & nicht erlaubt , ebenso wenig wie Type1 , es sei denn, für Type1 ist eine Verschiebung äquivalent zu einer Kopie (seit C++11) ).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ list < T,Allocator > :: const_iterator dereferenziert und dann implizit in beide konvertiert werden kann. ​

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 ( ) ) :

1) Genau N-1 Vergleiche mit operator == .
2) Genau N-1 Anwendungen des Prädikats p .

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)