Це код із коду видалення зі стандартної бібліотеки 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); }