Читаемая альтернатива std :: set :: find - PullRequest
1 голос
/ 15 марта 2011

Обычно меня не интересует стоимость предмета в наборе, меня интересует только то, существует он или нет.И многократное написание if (s.find(val) == s.end()) является длинным, уродливым и менее читаемым.

Есть ли хороший способ, который выглядит как if (contains(s,val)), что несколько стандартно (stl, boost).

Бонусное очкодля решения, которое работает и для карт.

Да, я знаю, что могу

#define has(X,Y) (X).find(Y) != (X).end()
template<T,U> inline bool has(T s,U elt) {return s.find(elt) != s.end();}

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

Ответы [ 2 ]

4 голосов
/ 15 марта 2011

Если ваше беспокойство касается в основном краткости, то я бы предложил:

if (s.count(val)) {
  // count == 1 == true, element exists
} else {
  // count == 0 == false, element does not exist
}

Но лично я все же предпочитаю проверять поиск против конца, поскольку намерение более явное. Это стоит немного набрать мне.

2 голосов
/ 15 марта 2011

if (s.find(val) == s.end()) - это «стандартный» способ проверки наличия элемента в контейнере.Насколько мне известно, ни Boost, ни стандартная библиотека не предлагают какой-либо функции, которая возвращает логическое значение, указывающее, существует ли элемент в контейнере.

Если вы хотите это сделать, вы быреализовать это самостоятельно.Для стандартной библиотеки или Boost просто не имеет смысла предоставлять существующую функциональность, которая выглядит просто по-другому.

Если вы захотите сделать это, наилучшим решением будет шаблонная реализация.Обычно не очень хорошая идея использовать определения в C ++.

...