Namespaces
Variants

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

Von de.cppreference.net

 
 
 
 
template< class BinaryPredicate = std::equal_to<T> >
size_type unique( BinaryPredicate binary_pred = BinaryPredicate() );
(seit C++26)

Entfernt alle aufeinanderfolgenden doppelten Elemente aus dem Container. Nur das erste Element jeder Gruppe gleicher Elemente bleibt erhalten.

Formaler ausgedrückt: Für eine nicht leere hive werden alle Elemente gelöscht, auf die der Iterator i im Bereich [begin() + 1, end()) zeigt, für den p(*i, *(i - 1)) wahr ist.

Macht Referenzen, Zeiger und Iteratoren, die auf die gelöschten Elemente verweisen, ungültig. Wenn das letzte Element im Bereich *this gelöscht wird, wird auch der Iterator für das Ende (past-the-end) ungültig.

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 der folgenden entsprechen:

bool pred(const Type1 &a, const Type2 &b);

Während die Signatur kein const & enthalten muss, darf die Funktion die ihr übergebenen Objekte nicht ändern und muss in der Lage sein, alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1 & nicht erlaubt, auch nicht 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 des Typs hive<T,Allocator>::const_iterator dereferenziert und dann implizit in beide konvertiert werden kann. ​

Typanforderungen
-
BinaryPredicate muss die Anforderungen von BinaryPredicate erfüllen.

Rückgabewert

Die Anzahl der entfernten Elemente.

Komplexität

Wenn empty() trueist, wird kein Vergleich durchgeführt.

Andernfalls, gegeben N als std::distance(begin(), end()):  genau N-1 Anwendungen des Prädikats p.

Beispiel

#include <iostream>
#include <hive>

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

int main()
{
    std::hive<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
(Funktionsvorlage & Algorithmus-Funktionsobjekt)