Daily bit(e) C++. std::min_element, std::max_element и std::minmax_element

Добавлено 29 июля 2023 в 21:04

Daily bit(e) C++ #202, алгоритмы min-max, работающие с итераторами: std::min_element, std::max_element и std::minmax_element.

Daily bit(e) C++ #202. std::min_element, std::max_element и std::minmax_element

std::min_element, std::max_element и (начиная с C++11) std::minmax_element – это алгоритмы min-max, которые работают с итераторами, возвращая итератор на минимальный/максимальный элемент.

Эти алгоритмы предоставляют варианты для параллельных вычислений (C ++ 17), а также варианты для constexpr и диапазонов (C ++ 20).

C++20 также предлагает более простую альтернативу: перегрузку базовых алгоритмов min-max для диапазонов.

#include <vector>
#include <algorithm>

std::vector<int> data{1,2,3,4,5};

auto min = std::min_element(data.begin(), data.end());
// min == data.begin(), *min == 1


auto max = std::max_element(data.begin(), data.end());
// max == std::prev(data.end()), *max == 5


auto [mi,ma] = std::minmax_element(data.begin(), data.end());
// mi == min, ma == max, *mi == 1, *ma == 5


// Если нам нужны только значения, C++20 предлагает более простую альтернативу:
auto [x,y] = std::ranges::minmax(data); // Возвращает по значению
// x == 1, y == 5


// Пример с проекциями:
struct Element {
    int v;
};

std::vector<Element> elements{{2},{1},{4},{5},{3}};
// Выбрать минимальный элемент на основе значения Element::v
auto it = std::ranges::min_element(elements, {}, &Element::v);
// *it == Element{1}

Смотреть пример на Compiler Explorer.

Теги

C++ / CppC++11C++20Daily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновИтераторПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.