Как найти минимальный элемент в заданном диапазоне индексов для вектора? - PullRequest
0 голосов
/ 01 февраля 2019

Как найти минимальный элемент в данном диапазоне индексов для std::vector?

Допустим, вектор равен

vector<int> v = {1,2,3,4,5};

Итак

min_element(v.begin(), v.end());

даст 1.

Но что, если мы хотим минимума от индексов 1 до 3?

То есть в элементах {2,3,4} из v2.

1 Ответ

0 голосов
/ 01 февраля 2019

Поскольку std::min_element работает в диапазоне [first, last) (от first до одного прошлого end), нам необходимо предоставить следующие данные:

const auto begin = v.begin() + 1;
const auto end = begin + 3;
int min = *std::min_element(begin, end);

или использовать std::next, чтобы сделать его родовым (кредиты @Slava)

auto min = *std::min_element(std::next(v.begin(), 1), std::next(v.begin(), 4));

Чтобы обернуть его в вспомогательную функцию:

template<typename Container, typename Predicate = std::less<>>
auto min_element(
    const Container &container,
    std::size_t startIdx,
    std::size_t endIdx,
    const Predicate pred = {}) -> std::decay_t<decltype(*(container.begin()))>
                               // typename Container::value_type   // or simply
{
    return *std::min_element(std::next(container.begin(), startIdx),
                             std::next(container.begin(), ++endIdx), pred);
}

теперь в основной

std::vector<int> v = { 1, 3, 5, 2, 1 };
const auto startIndex = 1u, endIndex = 3u;
const int min = ::min_element(v, startIndex, endIndex /*, predicate if any*/);

См. Живой пример


Однако убедитесь, что данные итераторы верны, в противном случае поведение будет UB.

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