Namensräume
Varianten
Aktionen

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

Von cppreference.com
 
 
 
 
(1)
void unique();
(seit C++11)
(bis C++20)
size_type unique();
(seit C++20)
(2)
template< class BinaryPredicate >
void unique( BinaryPredicate p );
(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 von gleichen Elementen 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.

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) 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 gleichbedeutend mit 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
-
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 keine Vergleichung durchgeführt.

Andernfalls, gegeben N als std::distance(begin(), end())

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

[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 <forward_list>
 
std::ostream& operator<< (std::ostream& os, std::forward_list<int> const& 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

[bearbeiten] Siehe auch

Entfernt aufeinanderfolgende doppelte Elemente in einem Bereich
(Funktionstemplate) [edit]