Что не так с `std :: set`?

Я думаю, что хорошо помнить, что поведение Вашего инструмента по умолчанию должно создать форму низкого уровня Связи Не Сцепление; и просмотрите его скептически и переопределите его, если это не имеет смысл по некоторым определенным упомянутым выше причинам. Но это не хорошее поведение по умолчанию.

21
задан Community 23 May 2017 в 11:53
поделиться

1 ответ

Функторы должны быть сконструированы таким образом, чтобы копия функтора была идентична оригинальному функтору. То есть, если вы делаете копию одного функтора и затем выполняете последовательность операций, результат должен быть одинаковым независимо от того, какой функтор вы используете, или даже если вы чередуете два функтора. Это дает реализации STL гибкость для копирования функторов и передачи их по своему усмотрению.

С вашим первым функтором это утверждение не выполняется, потому что, если я скопирую ваш функтор и затем вызову его, изменения, внесенные в его сохраненный набор, не будут отражены в исходном функторе, поэтому копия и оригинал будут работать по-разному. Аналогично, если вы возьмете второй функтор и не сохраните его набор по ссылке, две копии функтора не будут вести себя одинаково.

Причина того, что ваша окончательная версия функтора работает, заключается в том, что тот факт, что набор хранится по ссылке, означает, что любое количество копий фьюнтера будет вести себя идентично друг другу.

Надеюсь, это поможет!

17
ответ дан 29 November 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: