Lambda式は、匿名の関数オブジェクトを作成するための簡潔な方法を提供します。それらは、多くの場合、使用されるコンテキスト内でインラインで定義されます。構文は通常、次のようになります。
<code class="c ">[capture list](parameter list) -> return type { function body };</code>
キャプチャリスト:ラムダ内でアクセス可能な周囲のスコープからの変数を指定します。オプションは次のとおりです。
[]
:何もキャプチャしません。[=]
:周囲の範囲内のすべての変数を値でキャプチャします。[&]
:参照により、周囲の範囲内のすべての変数をキャプチャします。[=, &var1, &var2]
:参照によってキャプチャされるvar1
およびvar2
を除くすべての値をすべてキャプチャします。[var1, &var2]
: var1
を値でキャプチャし、 var2
参照してキャプチャします。->
後に明示的に指定することができます。または、コンパイラによって暗黙的に推定されます。例:
<code class="c ">#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; std::for_each(numbers.begin(), numbers.end(), [](int x){ std::cout </int></algorithm></vector></iostream></code>
ファンサー、または機能オブジェクトは、function call operator( operator()
)を過負荷するクラスです。これにより、クラスのインスタンスを「関数」と呼ぶことができます。
例:
<code class="c ">#include <iostream> #include <vector> class Doubler { public: void operator()(int x) { std::cout numbers = {1, 2, 3, 4, 5}; Doubler doubler; std::for_each(numbers.begin(), numbers.end(), doubler); // Output: 2 4 6 8 10 std::cout </vector></iostream></code>
主な違いは、簡潔さと範囲にあります。 Lambdaの式は、単純な操作のために大幅にコンパクトであり、個別のクラスを定義する必要性を排除します。また、範囲内で暗黙的に定義されているため、1回限りの運用に最適です。一方、機能者は明示的に定義されたクラスであり、より複雑なロジック、状態を維持するためのメンバー変数、およびコードの複数の部分にわたって潜在的な再利用を可能にします。ラムダは一般に、周囲の範囲から捕らえられているものを超えて状態を維持する能力が限られています。機能者は、ライフサイクル全体で状態を保存および操作するためのメンバー変数を持つことができます。
ラムダ式を好むとき:
次の場合を好むとき:
いいえ、Lambda ExpressionsとFunctorsを常に交換可能に使用することは常にできません。どちらも関数オブジェクトを表しますが、機能は異なります。 Lambdasは、簡潔でインラインの性質に優れており、短くて単純な操作に最適です。ただし、本格的なクラスの柔軟性はありません。クラスであるファンクターは、州の管理、メンバーの機能、再利用性をより強化しますが、より多くのボイラープレートコードを導入します。したがって、選択は特定のタスクの複雑さと要件に依存します。ステートフルオペレーションを備えた複雑な機能は、ファンチャーにより適していますが、ラムダの簡潔さからの単純で1回限りの使用操作のメリットがあります。
以上がCでLambda式と関数オブジェクト(ファンクター)を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。