Он реализовал пользовательское сравнение, используемое для std :: set, которое сравнивает только единицы, то есть сумму по модулю 10. Поскольку std :: set является шаблоном, он просто пытается вызвать что-то, похожее на функцию, независимо от того, является ли онаэто один или нет.Перегружая operator (), вы заставляете его действовать как функция.
В некоторых случаях это может быть очень мощным, потому что структура / класс может хранить состояние, а также дополнительные параметры.Все, что делает boost :: function / boost :: bind, основано на этом (и вам не нужно каждый раз создавать класс).
В самом закодированном примере, возможно, есть небольшой недостаток:упражнение состояло в том, чтобы просто отсортировать их по единицам, но это вполне могло бы устранить числа, которые имеют одинаковые единицы, но на самом деле не являются дубликатами.В вашем примере кода таких примеров нет (у вас есть дубликат, но это дубликат всего значения).Если бы у вас было 3478 в дополнение к 4548, компаратор множеств считал бы их одинаковыми и не разрешил бы дублирование.
Кстати, я не уверен, что set - это то, что я бы назвал «ассоциативным» контейнером,который относится к парам ключ-значение.В наборе нет связанных значений, только ключи.
Еще один момент: operator () должен быть постоянным.