最小・最大 (C++03 – C++20)

C++

概要

指定された値のうち、最大値・最大値を取得します。
値の指定方法は、
・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;
}

コメント

タイトルとURLをコピーしました