Функция max_by
Функция max_by возвращает максимальный
элемент итератора, используя для сравнения
заданную функцию-компаратор. Параметром функция
принимает замыкание, которое получает два элемента
и возвращает значение типа Ordering:
Less, Equal или Greater.
Функция возвращает None, если итератор пуст,
и Some с максимальным элементом в противном случае.
Синтаксис
iter.max_by(|a, b| a.cmp(b))
Пример
Давайте найдём максимальный элемент вектора
[1, 2, 3, 4, 5], сравнивая элементы
напрямую через cmp:
use std::cmp::Ordering;
fn main()
{
let vec = vec![1, 2, 3, 4, 5];
let res = vec.iter().max_by(|a, b| a.cmp(b));
println!("{:?}", res);
}
Результат выполнения кода:
Some(5)
Пример
Давайте найдём элемент с максимальной длиной
строки в векторе ["a", "abc", "ab"],
используя собственную функцию сравнения:
use std::cmp::Ordering;
fn main()
{
let vec = vec!["a", "abc", "ab"];
let res = vec.iter().max_by(|a, b| {
a.len().cmp(&b.len())
});
println!("{:?}", res);
}
Результат выполнения кода:
Some("abc")
Пример
Давайте найдём максимальный элемент по модулю
в векторе [-5, 3, -10, 7], сравнивая
абсолютные значения:
use std::cmp::Ordering;
fn main()
{
let vec = vec![-5, 3, -10, 7];
let res = vec.iter().max_by(|a, b| {
a.abs().cmp(&b.abs())
});
println!("{:?}", res);
}
Результат выполнения кода:
Some(-10)
Пример
Давайте проверим поведение функции на пустом векторе:
use std::cmp::Ordering;
fn main()
{
let vec: Vec<i32> = vec![];
let res = vec.iter().max_by(|a, b| a.cmp(b));
println!("{:?}", res);
}
Результат выполнения кода:
None
Смотрите также
-
функция
max,
которая возвращает максимальный элемент итератора -
функция
min_by,
которая возвращает минимальный элемент по критерию -
функция
max_by_key,
которая возвращает максимальный элемент по ключу -
тип
Ordering,
который представляет результат сравнения двух значений