Это код из стандартной библиотеки удаления кода C ++.
Неправильно. Это не C ++ стандартной библиотеки кода. Это одна из возможных внутренних реализаций стандартной библиотечной функции C ++ . Стандарт C ++ не предписывает фактический код; он предопределяет функциональные прототипы и требуемое поведение.remove
remove
Другими словами: с точки зрения языка, код, который вы видите , не существует . Это может быть из какого-то заголовочного файла, который поставляется с реализацией стандартной библиотеки вашего компилятора. Обратите внимание, что стандарт C ++ даже не требует, чтобы эти заголовочные файлы существовали. Файлы - это просто удобный способ для разработчиков компилятора удовлетворить требования для такой строки #include <algorithm>
(например, сделать std::remove
доступными и другие функции).
Почему неравенство проверяется if (!(*first == val))
вместо if (*first != val)
?
Потому operator==
что требуется только функция.
Когда речь заходит о перегрузке операторов для пользовательских типов, язык позволяет вам делать разные странные вещи. Вы могли бы очень хорошо создать класс, который перегружен, operator==
но не перегружен operator!=
. Или даже хуже: вы могли бы перегружать, operator!=
но делать это совершенно не связанными вещами.
Рассмотрим этот пример:
#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());
// ...
}
Если std::remove
использовать operator!=
, то результат будет совсем другим.
operator!=
. Просто используйтеoperator==
реализацию:bool operator!=(const Foo& other) { return !(*this == other); }