Задан упроядоченый vector из double, где каждый элемент представляет собой конец отрезка. Например, {1,3,5,6,9} -- означает, что существуют следующие отрезки: [1;3], [3;5], [5;6], [6;9]. Массив вектор заранее отсортирован. Требуется для некоторого числа x найти индекс элемента начала отрезка, к которому принадлежит x. Как реализовать такой поиск (здесь ведь ищется не совпадение элемента, а принадлежность числа к диапазону)?
Учитывая, что числа упорядочены и отрезки не перекрываются, достаточно рассмотреть 6 случаев.
поэтому, алгоритм такой. Проверяем на вхождения в диапазон первый-последний и отсекаем первые 4 варианта. Потом применяем обычный бинарный поиск std::lower_bound
и std::upper_bound
. Если они равны - 5 случай. Если не равны - знаем границы (итераторами). std::distance
поможет найти расстояние от начала (то есть, индекс).
На самом деле там нужен только один std::lower_bound
+ одно сравнение. Но для красоты объяснения было написано по другом.
Дополню ответ KoVadim небольшим кодом
std::vector<unsigned int> v = {1,3,5,7,9};
int to_find = 6;
auto it = std::upper_bound(v.begin(), v.end(), to_find);
int begin = *std::prev(it);
int last = *it;
Виртуальный выделенный сервер (VDS) становится отличным выбором
Недавно начал изучать перегрузку операторовПытаюсь перегрузить оператор * как пересечение множеств, но не могу понять как в данном случае...
Архивы форматов rar,zip, необходимо: распаковывать архив, получать определенный фаил из архива, получать древо каталогов и список всех файлов...
Я новичок в этой темеХотел попробовать сделать одновременную работу нескольких функций
Следует ли объявлять деструктор производного класса виртуальным, если в базовом классе он уже помечен таковым? Те