Este es el código de la biblioteca estándar de C ++ que elimina el código.
Incorrecto. No es elremove código de la biblioteca estándar de C ++ . Es una posible implementación interna de la removefunción de biblioteca estándar de C ++ . El estándar C ++ no prescribe el código real; Prescribe prototipos de funciones y comportamientos requeridos.
En otras palabras: desde un punto de vista estrictamente lingüístico, el código que está viendo no existe . Puede ser de algún archivo de encabezado que viene con la implementación de la biblioteca estándar de su compilador. Tenga en cuenta que el estándar C ++ ni siquiera requiere que existan esos archivos de encabezado . Los archivos son solo una forma conveniente para que los implementadores del compilador cumplan con los requisitos para una línea como #include <algorithm>(es decir, hacer std::removey otras funciones disponibles).
¿Por qué se prueba la desigualdad en if (!(*first == val))lugar de if (*first != val)?
Porque solo operator==es requerido por la función.
Cuando se trata de la sobrecarga del operador para tipos personalizados, el idioma le permite hacer todo tipo de cosas raras. Muy bien podría crear una clase que tenga una sobrecargada operator==pero no sobrecargada operator!=. O peor aún: podría sobrecargarse operator!=pero hacer que haga cosas completamente ajenas.
Considere este ejemplo:
#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());
// ...
}
Si se std::removeusa operator!=, el resultado sería bastante diferente.
operator!=. Solo usa laoperator==implementación:bool operator!=(const Foo& other) { return !(*this == other); }