「Cpp ラムダ式」の版間の差分
(ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) ラムダ式</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> <…」) |
(→ラムダ式) |
||
(同じ利用者による、間の2版が非表示) | |||
11行目: | 11行目: | ||
== '''ラムダ式''' == | == '''ラムダ式''' == | ||
よくわからない名称の技術ですが、STL(Standard Template Liblary)のstd::sortやstd::for_eachなどの引数としてプログラムそのものを記述することができる技術です。例えばsortの第三引数には、sortの手続きを行う関数名を指定する必要がありますが、ここにラムダ式を利用することができます。基本的な構造としては[](){}という構造のプログラムになり、[キャプチャ](プログラムの引数)->戻り値{プログラム本体}というような感じです。[](){}のそれぞれのカッコの中の全部が省略可能なので、引数まで省略すると[]{}というのがラムダ式としては最短の構造になります。これでは何にもしないラムダ式になってしまいます。 | よくわからない名称の技術ですが、STL(Standard Template Liblary)のstd::sortやstd::for_eachなどの引数としてプログラムそのものを記述することができる技術です。例えばsortの第三引数には、sortの手続きを行う関数名を指定する必要がありますが、ここにラムダ式を利用することができます。基本的な構造としては[](){}という構造のプログラムになり、[キャプチャ](プログラムの引数)->戻り値{プログラム本体}というような感じです。<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">[](){}</span>のそれぞれのカッコの中の全部が省略可能なので、引数まで省略すると<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">[]{}</span>というのがラムダ式としては最短の構造になります。これでは何にもしないラムダ式になってしまいます。 | ||
22行目: | 22行目: | ||
ラムダ式の何が便利なのか?sort関数を使ったことが無い人、sort関数を使う人でも関数を引数に指定するタイプの人には何の魅力もないものですが、C++11登場以降は、この記述方式を使うプログラマが増えているのも確かで、覚えておかないと人の書いたプログラムが理解できないというポンコツな人になってしまいます。ややこしさレベルはC++の技術の中では関数ポインタに肩を並べるややこしさを持っています。従来の[]の意味は配列だったし->というえばアロー演算子、こういうイメージを持っている場合は全く理解にたどり着けません。先にも書きましたが | ラムダ式の何が便利なのか?sort関数を使ったことが無い人、sort関数を使う人でも関数を引数に指定するタイプの人には何の魅力もないものですが、C++11登場以降は、この記述方式を使うプログラマが増えているのも確かで、覚えておかないと人の書いたプログラムが理解できないというポンコツな人になってしまいます。ややこしさレベルはC++の技術の中では関数ポインタに肩を並べるややこしさを持っています。従来の[]の意味は配列だったし->というえばアロー演算子、こういうイメージを持っている場合は全く理解にたどり着けません。先にも書きましたが | ||
*'''[キャプチャ](プログラム部に使う引数)->戻り値型名{プログラム本体}''' | |||
*'''<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">[キャプチャ](プログラム部に使う引数)->戻り値型名{プログラム本体}</span>''' | |||
33行目: | 34行目: | ||
最短ではない省略としては | 最短ではない省略としては | ||
*'''[キャプチャ](プログラム部に使う引数){関数本体}''' | |||
*'''<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">[キャプチャ](プログラム部に使う引数){関数本体}</span>''' | |||
40行目: | 42行目: | ||
文字だけであーだこーだ説明してもピンとこないのでまずはサンプルのプログラムを示してみましょう。最初はキャプチャを省略する例から… | 文字だけであーだこーだ説明してもピンとこないのでまずはサンプルのプログラムを示してみましょう。最初はキャプチャを省略する例から… | ||
<syntaxhighlight lang="cpp"> | |||
#include <iostream> | |||
// 関数オブジェクトを受け取り、その関数オブジェクトを実行する関数 | |||
template <typename Function> | |||
void operate(Function operation) { | |||
std::cout << "Result: " << operation() << std::endl; | |||
} | |||
int main() { | |||
int x = 5; | |||
int y = 3; | |||
// ラムダ式を使用して加算を行う関数オブジェクトを作成 | |||
auto add = [&]() { | |||
return x + y; | |||
}; | |||
// ラムダ式を使用して減算を行う関数オブジェクトを作成 | |||
auto subtract = [&]() { | |||
return x - y; | |||
}; | |||
// 加算の関数オブジェクトを渡して結果を表示 | |||
operate(add); | |||
// 減算の関数オブジェクトを渡して結果を表示 | |||
operate(subtract); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
キャプチャの[&]はラムダ式の関数内で使われる全ての未定義変数を参照する変数として扱うという万能すぎて、危ない可能性もある使い方です。便利です。ここではaddというラムダ式とsubtractというラムダ式をoperateというTemplate関数を使って出力しているサンプルとしました。 | |||
[[C PlusPlus#C++からの技術|C++]]に戻る | [[C PlusPlus#C++からの技術|C++]]に戻る |
2024年2月27日 (火) 16:26時点における最新版
C++に戻る
本来の表記は「C++(Cpp) ラムダ式」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。 |
※このページではC++にのみ存在する機能として、記事タイトルがC++ ラムダ式になっています。
ラムダ式
よくわからない名称の技術ですが、STL(Standard Template Liblary)のstd::sortやstd::for_eachなどの引数としてプログラムそのものを記述することができる技術です。例えばsortの第三引数には、sortの手続きを行う関数名を指定する必要がありますが、ここにラムダ式を利用することができます。基本的な構造としては[](){}という構造のプログラムになり、[キャプチャ](プログラムの引数)->戻り値{プログラム本体}というような感じです。[](){}のそれぞれのカッコの中の全部が省略可能なので、引数まで省略すると[]{}というのがラムダ式としては最短の構造になります。これでは何にもしないラムダ式になってしまいます。
そもそも、ラムダとは何なのか?ラムダの意味?それは、その昔、関数による計算の記号にλ(lambda:ラムダ)を使っていたことに由来し、関数による計算を行うという技術であることからC++やほかの言語でも、こういったプログラム技術をラムダ式と呼びます。JAVA、LISP、ML、Haskelでも同様にラムダ式という呼び方がされます。
それで…
ラムダ式の何が便利なのか?sort関数を使ったことが無い人、sort関数を使う人でも関数を引数に指定するタイプの人には何の魅力もないものですが、C++11登場以降は、この記述方式を使うプログラマが増えているのも確かで、覚えておかないと人の書いたプログラムが理解できないというポンコツな人になってしまいます。ややこしさレベルはC++の技術の中では関数ポインタに肩を並べるややこしさを持っています。従来の[]の意味は配列だったし->というえばアロー演算子、こういうイメージを持っている場合は全く理解にたどり着けません。先にも書きましたが
- [キャプチャ](プログラム部に使う引数)->戻り値型名{プログラム本体}
という、こういう構造をよく覚える必要があります。[]()->戻り値の型名{}ですね。とんでもない記号にも見えてきます。新しい技術なのだから新しいと感じて当たり前なのです。予告なく似たような記号の組み合わせが全く違う意味で使われる。これがプログラミングを知ったつもりになっている時おとずれる混乱の原因になります。おぼえてしまえば、なんてことはない変な技術なのです。
特に気になるのが[]の中のキャプチャですね。キャプチャって言われても…意味がいまひとつ分からない。これはラムダ式の関数本体の外側で使っていた変数で、利用するものを指定する部分です。
最短ではない省略としては
- [キャプチャ](プログラム部に使う引数){関数本体}
というのもよく使われると思います。これは関数本体が戻り値を持たないかretuen文で返される値の型に従う場合に ->戻り値の型名 が省略できます。
文字だけであーだこーだ説明してもピンとこないのでまずはサンプルのプログラムを示してみましょう。最初はキャプチャを省略する例から…
#include <iostream>
// 関数オブジェクトを受け取り、その関数オブジェクトを実行する関数
template <typename Function>
void operate(Function operation) {
std::cout << "Result: " << operation() << std::endl;
}
int main() {
int x = 5;
int y = 3;
// ラムダ式を使用して加算を行う関数オブジェクトを作成
auto add = [&]() {
return x + y;
};
// ラムダ式を使用して減算を行う関数オブジェクトを作成
auto subtract = [&]() {
return x - y;
};
// 加算の関数オブジェクトを渡して結果を表示
operate(add);
// 減算の関数オブジェクトを渡して結果を表示
operate(subtract);
return 0;
}
キャプチャの[&]はラムダ式の関数内で使われる全ての未定義変数を参照する変数として扱うという万能すぎて、危ない可能性もある使い方です。便利です。ここではaddというラムダ式とsubtractというラムダ式をoperateというTemplate関数を使って出力しているサンプルとしました。
C++に戻る