Dies ist der Code aus der C ++ - Standardbibliothek zum Entfernen von Code.
Falsch. Es ist nicht der C ++ - Standardbibliothekscode remove
. Dies ist eine mögliche interne Implementierung der C ++ - Standardbibliotheksfunktion remove
. Der C ++ - Standard schreibt keinen tatsächlichen Code vor. Es schreibt Funktionsprototypen und erforderliche Verhaltensweisen vor.
Mit anderen Worten: Aus strenger sprachlicher Sicht existiert der Code, den Sie sehen , nicht . Möglicherweise stammt es aus einer Header-Datei, die mit der Standardbibliotheksimplementierung Ihres Compilers geliefert wird. Beachten Sie, dass der C ++ - Standard nicht einmal erfordert, dass diese Header- Dateien vorhanden sind. Dateien sind nur eine bequeme Möglichkeit für Compiler-Implementierer, die Anforderungen für eine Zeile wie #include <algorithm>
(dh das Bereitstellen std::remove
und andere verfügbare Funktionen) zu erfüllen .
Warum wird Ungleichheit als if (!(*first == val))
statt getestet if (*first != val)
?
Weil nur operator==
von der Funktion benötigt wird.
Wenn es um das Überladen von Operatoren für benutzerdefinierte Typen geht, können Sie mit der Sprache alle möglichen seltsamen Dinge tun. Sie können sehr gut eine Klasse erstellen, die überladen, operator==
aber nicht überladen ist operator!=
. Oder noch schlimmer: Sie könnten überladen, operator!=
aber völlig unabhängige Dinge tun lassen.
Betrachten Sie dieses Beispiel:
#include <algorithm>
#include <vector>
struct Example
{
int i;
Example() : i(0) {}
bool operator==(Example const& other) const
{
return i == other.i;
}
bool operator!=(Example const& other) const
{
return i == 5; // weird, but nothing stops you
// from doing so
}
};
int main()
{
std::vector<Example> v(10);
// ...
auto it = std::remove(v.begin(), v.end(), Example());
// ...
}
Bei std::remove
Verwendung operator!=
wäre das Ergebnis ganz anders.
operator!=
. Verwenden Sie einfach dieoperator==
Implementierung:bool operator!=(const Foo& other) { return !(*this == other); }