Este é o código do código de remoção da biblioteca padrão C ++.
Errado. Não é oremove
código de biblioteca padrão do C ++ . É uma possível implementação interna da remove
função de biblioteca padrão C ++ . O padrão C ++ não prescreve código real; prescreve protótipos de função e comportamentos necessários.
Em outras palavras: Do ponto de vista estrito do idioma, o código que você está vendo não existe . Pode ser de algum arquivo de cabeçalho que acompanha a implementação da biblioteca padrão do seu compilador. Observe que o padrão C ++ nem exige que esses arquivos de cabeçalho existam. Os arquivos são apenas uma maneira conveniente para os implementadores de compiladores atenderem aos requisitos de uma linha como #include <algorithm>
(por exemplo, disponibilização std::remove
e outras funções).
Por que a desigualdade é testada em if (!(*first == val))
vez de if (*first != val)
?
Porque somente operator==
é requerido pela função.
Quando se trata de sobrecarga de operador para tipos personalizados, o idioma permite que você faça todos os tipos de coisas estranhas. Você pode muito bem criar uma classe que tenha uma sobrecarga, operator==
mas não sobrecarregada operator!=
. Ou pior: você pode sobrecarregar, operator!=
mas fazer com que coisas completamente não relacionadas.
Considere este exemplo:
#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());
// ...
}
Se std::remove
usado operator!=
, o resultado seria bem diferente.
operator!=
. Basta usar aoperator==
implementação:bool operator!=(const Foo& other) { return !(*this == other); }