C'est le code de la norme C++ de la bibliothèque de supprimer le code.
Mal. Ce n'est pas le C++ standard library remove
code. Il est possible internes de mise en œuvre de la norme C++ library remove
fonction. La norme C++ ne prescrit pas de code; il prescibes prototypes de fonction et les comportements requis.
En d'autres termes: à Partir d'un langage " strict point de vue, le code que vous voyez n'existe pas. Il peut être de quelques fichier d'en-tête qui vient avec votre compilateur standard-mise en œuvre de bibliothèque. Notez que la norme C++ n'exige même pas ceux de l'en-tête des fichiers d'exister. Les fichiers sont juste un moyen pratique pour le compilateur réalisateurs pour répondre aux exigences d'une ligne comme celle - #include <algorithm>
( std::remove
et les autres fonctions disponibles).
Pourquoi l'inégalité testé en tant que if (!(*first == val))
au lieu de if (*first != val)
?
Parce que seulement operator==
est requis par la fonction.
Quand il s'agit de la surcharge d'opérateur pour les types personnalisés, la langue vous permet de faire toutes sortes de choses bizarres. Vous pouvez très bien créer une classe qui a surchargé operator==
mais pas surchargé operator!=
. Ou pire encore: Vous pouvez la surcharge operator!=
mais il a de le faire totalement sans rapport avec les choses.
Considérons cet exemple:
#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 std::remove
utilisé operator!=
, alors le résultat serait tout à fait différent.