概要
指定された値のうち、最大値・最大値を取得します。
値の指定方法は、
・2つの値を指定します(C++03)。
・{}で囲まれた値のリスト(initializer_list)を指定します(C++11)。
・std::xxx(C++03): 対象の範囲 [first, last) のイテレータ―を指定します。
・std::ranges::xxx(C++20): 対象の範囲 [first, last) のイテレータ―を指定します。
・std::ranges::xxx(C++20): 対象の範囲を直接指定します。
条件判定に関数を指定できます。※
std::ranges::xxx(C++20): 射影(projection)関数を指定できるものがあります。※
※詳細についてはこちらを参照してください。
https://mappuri.com/program/cpp20-algorithm/
最小値・最大値
min
指定された値のうち、最小値を取得します。
max
指定された値のうち、最大値を取得します。
minmax
指定された値のうち、最小値・最大値を取得します。
min, max, minmax のサンプル(C++03, C++11)
#include <algorithm>
#include <iostream>
int main(int argc, char* argv[]) {
{
// 最小値を取得します。(C++03)
int min = std::min(10, 20);
std::cout << "min = " << min << std::endl; // min = 10
}
{
// 最小値を取得します。(C++11)
int min = std::min({ 1, 2, 3, 4, 5 });
std::cout << "min = " << min << std::endl; // min = 1
}
{
// 最小値を取得します。(C++11)
int min = std::min({ 1, -2, 3, 4, -5 },
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "min = " << min << std::endl; // min = 1
}
{
// 最大値を取得します。(C++03)
int max = std::max(10, 20);
std::cout << "max = " << max << std::endl; // max = 20
}
{
// 最大値を取得します。(C++11)
int max = std::max({ 1, 2, 3, 4, 5 });
std::cout << "max = " << max << std::endl; // max = 5
}
{
// 最大値を取得します。(C++11)
int max = std::max({ 1, -2, 3, 4, -5 },
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "max = " << max << std::endl; // max = -5
}
{
// 最小値・最大値を取得します。(C++11)
auto minmax = std::minmax(10, 20);
std::cout << "min = " << minmax.first << ", max = " << minmax.second << std::endl; // min = 10, max = 20
}
{
// 最小値・最大値を取得します。(C++11)
auto minmax = std::minmax({ 1, 2, 3, 4, 5 });
std::cout << "min = " << minmax.first << ", max = " << minmax.second << std::endl; // min = 1, max = 5
}
{
// 最小値・最大値を取得します。(C++11)
auto minmax = std::minmax({ 1, -2, 3, 4, -5 },
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "min = " << minmax.first << ", max = " << minmax.second << std::endl; // min = 1, max = -5
}
return 0;
}
min, max, minmax のサンプル(C++20 range)
#include <algorithm>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
{
// 最小値を取得します。(C++20)
int min = std::ranges::min(10, 20);
std::cout << "min = " << min << std::endl; // min = 10
}
{
// 最小値を取得します。(C++20)
int min = std::ranges::min({ 1, 2, 3, 4, 5 });
std::cout << "min = " << min << std::endl; // min = 1
}
{
// 最小値を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
int min = std::ranges::min(r);
std::cout << "min = " << min << std::endl; // min = 1
}
{
// 最小値を取得します。(C++20)
std::vector<int> r = { 1, -2, 3, 4, -5 };
int min = std::ranges::min(r,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "min = " << min << std::endl; // min = 1
}
{
// 最大値を取得します。(C++20)
int max = std::ranges::max(10, 20);
std::cout << "max = " << max << std::endl; // max = 20
}
{
// 最大値を取得します。(C++11)
int max = std::ranges::max({ 1, 2, 3, 4, 5 });
std::cout << "max = " << max << std::endl; // max = 5
}
{
// 最大値を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
int max = std::ranges::max(r);
std::cout << "max = " << max << std::endl; // max = 5
}
{
// 最大値を取得します。(C++20)
std::vector<int> r = { 1, -2, 3, 4, -5 };
int max = std::ranges::max(r,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "max = " << max << std::endl; // max = -5
}
{
// 最小値・最大値を取得します。(C++20)
auto minmax = std::ranges::minmax(10, 20);
std::cout << "min = " << minmax.min << ", max = " << minmax.max << std::endl; // min = 10, max = 20
}
{
// 最小値・最大値を取得します。(C++20)
auto [min, max] = std::ranges::minmax(10, 20);
std::cout << "min = " << min << ", max = " << max << std::endl; // min = 10, max = 20
}
{
// 最小値・最大値を取得します。(C++20)
auto minmax = std::ranges::minmax({ 1, 2, 3, 4, 5 });
std::cout << "min = " << minmax.min << ", max = " << minmax.max << std::endl; // min = 1, max = 5
}
{
// 最小値・最大値を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto minmax = std::ranges::minmax(r);
std::cout << "min = " << minmax.min << ", max = " << minmax.max << std::endl; // min = 1, max = 5
}
{
// 最小値・最大値を取得します。(C++20)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto minmax = std::ranges::minmax(r,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "min = " << minmax.min << ", max = " << minmax.max << std::endl; // min = 1, max = -5
}
return 0;
}
最小値・最大値の位置
min_element
範囲の最小値の最初の位置を取得します。
範囲は順方向に参照可能である必要があります。
max_element
範囲の最大値の最初の位置を取得します。範囲は順方向に参照可能である必要があります。
minmax_element
範囲の最小値と最大値の最初の位置を取得します。
範囲は順方向に参照可能である必要があります。
min_element, max_element, minmax_element のサンプル(C++03)
#include <iostream>
/** r 内の [first, last) の範囲と値を出力 範囲:[0, 9) 値:1 2 3 4 5 4 5 6 6 */
template<class T, class U, class V>
static void output(T&& r, U&& first, V&& last) {
std::cout << "範囲:[" << std::distance(std::begin(r), first) << ", " << std::distance(std::begin(r), last) << ")";
std::cout << " 値:";
std::string delim = "";
for (auto i = first; i != last; ++i, delim = ", ") {
std::cout << delim << *i;
}
std::cout << std::endl;
}
/** r 内の it の位置と値を出力 位置:2 値:3 */
template<class T, class U>
static void output(T&& r, U&& it) {
std::cout << "位置:" << std::distance(std::begin(r), it);
std::cout << " 値:";
if (it == std::end(r) || &*it == nullptr) {
std::cout << "end";
} else {
std::cout << *it;
}
std::cout << std::endl;
}
#include <algorithm>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
{
// 最小値の要素を取得します。(C++03)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto min_element = std::min_element(r.begin(), r.end());
output(r, min_element); // 位置:0 値:1
}
{
// 最小値の要素を取得します。(C++03)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto min_element = std::min_element(r.begin(), r.end(),
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
output(r, min_element); // 位置:0 値:1
}
{
// 最大値の要素を取得します。(C++03)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto max_element = std::max_element(r.begin(), r.end());
output(r, max_element); // 位置:4 値:5
}
{
// 最大値の要素を取得します。(C++03)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto max_element = std::max_element(r.begin(), r.end(),
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
output(r, max_element); // 位置:4 値:-5
}
{
// 最小値・最大値の要素を取得します。(C++03)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto minmax_element = std::minmax_element(r.begin(), r.end());
output(r, minmax_element.first); // 位置:0 値:1
output(r, minmax_element.second); // 位置:4 値:5
}
{
// 最小値・最大値の要素を取得します。(C++03)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto minmax_element = std::minmax_element(r.begin(), r.end(),
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
output(r, minmax_element.first); // 位置:0 値:1
output(r, minmax_element.second); // 位置:4 値:-5
}
return 0;
}
min_element, max_element, minmax_element のサンプル(C++20 range)
#include <algorithm>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
{
// 最小値の要素を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto min_element = std::ranges::min_element(r);
output(r, min_element); // 位置:0 値:1
}
{
// 最小値の要素を取得します。(C++20)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto min_element = std::ranges::min_element(r,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
output(r, min_element); // 位置:0 値:1
}
{
// 最大値の要素を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto max_element = std::ranges::max_element(r);
output(r, max_element); // 位置:4 値:5
}
{
// 最大値の要素を取得します。(C++20)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto max_element = std::ranges::max_element(r,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
output(r, max_element); // 位置:4 値:-5
}
{
// 最小値・最大値の要素を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto minmax_element = std::ranges::minmax_element(r);
output(r, minmax_element.min); // 位置:0 値:1
output(r, minmax_element.max); // 位置:4 値:5
}
{
// 最小値・最大値の要素を取得します。(C++20)
std::vector<int> r = { 1, 2, 3, 4, 5 };
auto [min, max] = std::ranges::minmax_element(r);
output(r, min); // 位置:0 値:1
output(r, max); // 位置:4 値:5
}
{
// 最小値・最大値の要素を取得します。(C++20)
std::vector<int> r = { 1, -2, 3, 4, -5 };
auto minmax_element = std::ranges::minmax_element(r,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
output(r, minmax_element.min); // 位置:0 値:1
output(r, minmax_element.max); // 位置:4 値:-5
}
return 0;
}
値を範囲内に収める
clamp
値を範囲内に収めます。
clamp のサンプル(C++17)
#include <algorithm>
#include <iostream>
int main(int argc, char* argv[]) {
{
// 値を範囲内に収めます。(C++17)
int clamp = std::clamp(100, 10, 20);
std::cout << "clamp = " << clamp << std::endl; // clamp = 20
}
{
// 値を範囲内に収めます。(C++17)
int clamp = std::clamp(-100, 10, 20,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "clamp = " << clamp << std::endl; // clamp = 20
}
return 0;
}
clamp のサンプル(C++20)
#include <algorithm>
#include <iostream>
int main(int argc, char* argv[]) {
{
// 値を範囲内に収めます。(C++20)
int clamp = std::ranges::clamp(100, 10, 20);
std::cout << "clamp = " << clamp << std::endl; // clamp = 20
}
{
// 値を範囲内に収めます。(C++20)
int clamp = std::ranges::clamp(-100, 10, 20,
[](int x, int y) { return std::abs(x) < std::abs(y); }); // 絶対値で比較
std::cout << "clamp = " << clamp << std::endl; // clamp = 20
}
return 0;
}
コメント