ラムダ式によるソート
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 47/56。
C++標準ライブラリは、ベクターのようなコンテナをソートできる、<algorithm>ヘッダーのstd::sortという強力な関数を提供しています。
デフォルトでは、std::sort は要素を昇順(小さい順)に並べ替えます。しかし、要素をどのように比較するかを定義するラムダ式を提供することで、この動作をカスタマイズできます:
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// ラムダ式を使用して降順にソート
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // aがbの前に来るべき場合にtrueを返す
});ラムダは、比較される要素を表す2つのパラメータを受け取り、ソート結果において最初の要素が2番目の要素の前に来るべき場合にtrueを返します。降順の場合、a > bのときにtrueを返します。これにより、より大きな数値が先に配置されます。
これは、ラムダ式を使用することで、別途比較関数を記述することなく標準ライブラリ関数を簡単にカスタマイズでき、ソートのロジックを必要な場所にそのまま記述できることを示しています。
チャレンジ
簡単std::sort とラムダ式を使用したカスタムソートを実演するプログラムを作成してください。このチャレンジでは、コンテナをソートするためのカスタム比較ロジックを定義するために、ラムダ関数をどのように使用するかについての理解をテストします。
以下の入力が提供されます:
- ベクター内の要素数を表す整数
n - ソートされる要素を表す
n個の整数 - ソート順序を表す文字
order(昇順の場合はA、降順の場合はD)
プログラムは以下の手順で行う必要があります:
std::vector<int>を作成し、入力された数値を格納します<algorithm>ヘッダーのstd::sortをラムダ式と共に使用して、ベクターをソートします- ラムダ式は2つの整数パラメータを受け取り、ブール値を返す必要があります
- 順序を表す文字に基づいて、ラムダ式内に適切な比較ロジックを実装します
- ソートされたベクターの各要素を、それぞれ新しい行に出力します
ソートの動作は以下の通りです:
orderがAの場合:昇順(小さい順)にソートしますorderがDの場合:降順(大きい順)にソートします
以下の正確な出力形式を使用してください:
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]std::sort は、開始イテレータ、終了イテレータ、および比較関数の3つのパラメータを取ることを忘れないでください。イテレータには vector.begin() と vector.end() を使用します。ラムダ比較関数は、ソート結果において最初のパラメータが2番目のパラメータより前に来るべき場合に true を返す必要があります。昇順の場合は a < b を返し、降順の場合は a > b を返します。
チートシート
<algorithm>ヘッダーのstd::sort関数は、vectorのようなコンテナをソートします。デフォルトでは昇順にソートされますが、ラムダ式を使用してソート動作をカスタマイズできます。
基本構文:
std::sort(container.begin(), container.end(), comparison_lambda);ラムダ式は比較される要素を表す2つのパラメータを受け取り、ソート結果において最初の要素が2番目の要素の前に来るべき場合にtrueを返します。
例 - 降順:
#include <algorithm>
#include <vector>
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // 大きい数字が先に来る
});例 - 昇順:
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b; // 小さい数字が先に来る
});自分で試してみよう
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 入力を読み込む
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: 以下にコードを記述してください
// ラムダ式を使用してstd::sortを使い、ベクトルをソートします
// 並べ替え文字(Aは昇順、Dは降順)に基づいてソートします
// ソートされた要素を出力する
for (int num : numbers) {
cout << num << endl;
}
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。