Я активно використовую std::set<int>
і часто мені просто потрібно перевірити, чи містить такий набір число чи ні.
Мені було б природно писати:
if (myset.contains(number))
...
Але через відсутність contains
члена мені потрібно написати громіздкий:
if (myset.find(number) != myset.end())
..
або не так очевидно:
if (myset.count(element) > 0)
..
Чи є причина такого дизайнерського рішення?
count()
підходу полягає в тому, що він робить більше роботи, ніж countains()
повинен був би зробити.
contains()
що повертає bool
б втратити цінну інформацію про те, де елемент знаходиться в колекції . find()
зберігає та повертає цю інформацію у вигляді ітератора, тому є кращим вибором для такої загальної бібліотеки, як STL. (Це не означає, що bool contains()
це не дуже приємне або навіть необхідне.)
contains(set, element)
безкоштовну функцію легко, використовуючи загальнодоступний інтерфейс набору. Тому інтерфейс набору функціонально повний; додавання зручного методу просто збільшує інтерфейс, не вмикаючи жодної додаткової функції, що не є способом C ++.