Установка вектора в качестве общего параметра - PullRequest
0 голосов
/ 11 января 2020

Итак, я пытался создать функцию, которая будет получать векторные объекты как общий тип в C ++. У меня есть три класса кофе, закуски и соки. И у меня есть функция двоичного поиска для поиска определенного элемента c в каждом из трех векторных объектов, созданных этими классами. Но чтобы выполнить бинарный поиск, мне нужно определить три функции бинарного поиска. Например, binarySearchCoffee (вектор coffeeList), binarySearchSnack (вектор coffeeList) и то же самое для сока. Итак, есть ли способ создать общий параметр типа вектора, который будет принимать все, что я вставил, или определение трех функций является обычным? Но я так не думаю, потому что это нарушает правило DRY. Спасибо за ваше время.

1 Ответ

5 голосов
/ 11 января 2020

Для этого и нужны шаблоны. Действительно, так работает сам вектор !!

template <typename ElementType>
bool DoMyBinarySearch(const std::vector<ElementType>& container, const ElementType& value)
{
   auto it = std::lower_bound(std::begin(container), std::end(container), value);
   return it != std::end(container) && *it == value;
}

Вы можете даже подумать о том, чтобы container набрал аргумент шаблона, чтобы вы не ограничивались векторами (хотя это может в этом случае бесполезно).

В этом примере также не рассматриваются альтернативные распределители или альтернативные компараторы, которые могут иметь или не иметь значения для вас. cppreference.com's std::lower_bound article имеет более надежный пример.

Не забудьте задокументировать предварительное условие, что container должен быть отсортирован.

...