Namespaces
Variants

std::ranges::max_element

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジのアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書式比較操作
順列操作


 
制約付きアルゴリズム
このメニューのすべての名前は名前空間 std::ranges
非変更シーケンス操作
変更シーケンス操作
分割操作
ソート操作
二分探索操作 (ソート済み範囲に対して)
       
       
集合操作 (ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
       
       
順列操作
畳み込み操作
数値操作
(C++23)            
未初期化ストレージに対する操作
戻り値の型
 
ヘッダ <algorithm>
で定義
template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
          std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less >
constexpr I
    max_element( I first, S last, Comp comp = {}, Proj proj = {} );
呼び出しシグネチャ (C++20 から)
template< ranges::forward_range R, class Proj = std::identity,
          std::indirect_strict_weak_order<
              std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less >
constexpr ranges::borrowed_iterator_t<R>
    max_element( R&& r, Comp comp = {}, Proj proj = {} );
(2) (C++20 から)
1) 範囲 [first, last) 内の最大の要素を見つけます。
2) (1) と同じですが、r をソース範囲として使用します。あたかも ranges::begin(r) を first として、ranges::end(r) を last として使用するかのようです。

このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト (非公式には niebloids として知られています)、つまり:

パラメータ

first, last - 検査対象の要素の 範囲 を定義するイテレータ-番兵ペア
r - 検査対象の range
comp - 投影された要素に適用する比較関数
proj - 要素に適用する投影関数

戻り値

範囲 [ first , last ) 内の最大要素へのイテレータ。範囲内の複数の要素が最大要素と等価である場合、最初のそのような要素へのイテレータを返します。範囲が空の場合(つまり first == last の場合)、 last と等価なイテレータを返します。

計算量

正確に max(N - 1, 0) 回の比較、ここで N = ranges:: distance ( first, last ) 。

実装例

struct max_element_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
             std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less>
    constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        if (first == last)
            return last;
        auto largest = first;
        while (++first != last)
            if (std::invoke(comp, std::invoke(proj, *largest), std::invoke(proj, *first)))
                largest = first;
        return largest;
    }
    template<ranges::forward_range R, class Proj = std::identity,
             std::indirect_strict_weak_order<
                 std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj));
    }
};
inline constexpr max_element_fn max_element;

例

#include <algorithm>
#include <cmath>
#include <iostream>
int main()
{
    namespace ranges = std::ranges;
    const auto v = {3, 1, -14, 1, 5, 9, -14, 9};
    auto result = ranges::max_element(v.begin(), v.end());
    std::cout << "Max element at pos " << ranges::distance(v.begin(), result) << '\n';
    auto abs_compare = [](int a, int b) { return std::abs(a) < std::abs(b); };
    result = ranges::max_element(v, abs_compare);
    std::cout << "Absolute max element at pos "
              << ranges::distance(v.begin(), result) << '\n';
}

出力:

Max element at pos 5
Absolute max element at pos 2

関連項目

範囲内の最小要素を返す
(アルゴリズム関数オブジェクト)
範囲内の最小要素と最大要素を返す
(アルゴリズム関数オブジェクト)
指定された値の中で最大のものを返す
(アルゴリズム関数オブジェクト)
範囲内の最大要素を返す
(関数テンプレート)