Есть ли функция, похожая на std :: lower_bound, без необходимости сортировки / разбиения ввода? - PullRequest
0 голосов
/ 23 февраля 2020

Существует ли функция STL, которая возвращает итератор или индекс для наименьшего элемента, большего, чем некоторое входное значение в несортированном массиве. std::lower_bound не работает, потому что требует разбиения, а мой массив не разбит на части в соответствии с его требованиями.

Например,

int main(int argc, char const *argv[])
{
   vector<int> vec{5,1,2,9,1,5,3};

   std::cout << std::lower_bound(vec.begin(), vec.end(), 2) - vec.begin() << std::endl;
}

Вывод здесь равен 3, когда я хочу, чтобы это было 6, соответствующее vec [6].

1 Ответ

4 голосов
/ 23 февраля 2020

Нет такого алгоритма STL. Вы можете найти список всех из них здесь . Сказав это, можно реализовать такую ​​функцию, злоупотребив min_element:

template <typename ForwardIt, typename Value>
ForwardIt unsortedLowerBound(ForwardIt const beg, ForwardIt const end,
                             Value const& val) {
  auto result =
      std::min_element(beg, end, [&val](auto const& e1, auto const& e2) {
        if (e1 <= val) return false;
        if (e2 <= val) return true;
        return e1 < e2;
      });
  if (result != end && *result <= val) result = end;
  return result;
}

Кроме того, обратите внимание, что вы должны проверить с помощью end, чтобы увидеть, есть ли какой-либо элемент, который удовлетворяет требованию ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...