Namespaces
Variants

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

Von de.cppreference.net

 
 
 
 
void unique();
(1) (seit C++11)
(bis C++20)
size_type unique();
(seit C++20)
template< class BinaryPredicate >
void unique( BinaryPredicate p );
(2) (seit C++11)
(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 gleicher Elemente bleibt erhalten.

Macht nur die Iteratoren und Referenzen auf die entfernten Elemente ungültig.

1) Verwendet operator== zum Vergleichen der Elemente.
2) Verwendet p zum Vergleichen der Elemente.

Das Verhalten ist undefiniert, wenn der entsprechende Komparator 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 nicht 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 forward_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 <forward_list>

std::ostream& operator<< (std::ostream& os, const std::forward_list<int>& container)
{
    for (int val : container)
        os << val << ' ';
    return os << '\n';
}

int main()
{
    std::forward_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

Siehe auch

entfernt aufeinanderfolgende doppelte Elemente in einem Bereich
(Funktionstemplate & Algorithmus Funktionsobjekt)