ホームページ > バックエンド開発 > C++ > CでLambda式と関数オブジェクト(ファンクター)を使用するにはどうすればよいですか?

CでLambda式と関数オブジェクト(ファンクター)を使用するにはどうすればよいですか?

Robert Michael Kim
リリース: 2025-03-12 16:54:15
オリジナル
812 人が閲覧しました

cでラムダの表現と関数オブジェクト(ファンクター)の使用方法

Lambda式は、匿名の関数オブジェクトを作成するための簡潔な方法を提供します。それらは、多くの場合、使用されるコンテキスト内でインラインで定義されます。構文は通常、次のようになります。

 <code class="c  ">[capture list](parameter list) -> return type { function body };</code>
ログイン後にコピー
  • キャプチャリスト:ラムダ内でアクセス可能な周囲のスコープからの変数を指定します。オプションは次のとおりです。

    • [] :何もキャプチャしません。
    • [=] :周囲の範囲内のすべての変数を値でキャプチャします。
    • [&] :参照により、周囲の範囲内のすべての変数をキャプチャします。
    • [=, &var1, &var2] :参照によってキャプチャされるvar1およびvar2を除くすべての値をすべてキャプチャします。
    • [var1, &var2]var1を値でキャプチャし、 var2参照してキャプチャします。
  • パラメーターリスト:通常の関数パラメーターと同様。
  • 戻りタイプ: ->後に明示的に指定することができます。または、コンパイラによって暗黙的に推定されます。
  • 関数本文: Lambdaによって実行されたコード。

例:

 <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>
ログイン後にコピー

CでLambda ExpressionsとFunctorsを使用することの実際的な違いは何ですか?

主な違いは、簡潔さと範囲にあります。 Lambdaの式は、単純な操作のために大幅にコンパクトであり、個別のクラスを定義する必要性を排除します。また、範囲内で暗黙的に定義されているため、1回限りの運用に最適です。一方、機能者は明示的に定義されたクラスであり、より複雑なロジック、状態を維持するためのメンバー変数、およびコードの複数の部分にわたって潜在的な再利用を可能にします。ラムダは一般に、周囲の範囲から捕らえられているものを超えて状態を維持する能力が限られています。機能者は、ライフサイクル全体で状態を保存および操作するためのメンバー変数を持つことができます。

cで、cでは、ファンサーよりもラムダの表現を好むのはいつですか?その逆はいつですか?

ラムダ式を好むとき:

  • 一度だけ使用されるシンプルで短い匿名の関数が必要です。
  • 周囲の範囲から変数をキャプチャする必要があります。
  • 簡潔さは優先事項です。

次の場合を好むとき:

  • 複数の方法または内部状態を備えたより複雑な機能が必要です。
  • コードの複数の部分で関数を再利用する必要があります。
  • 関数呼び出し間で状態を維持する必要があります。
  • 継承や多型など、より高度な機能が必要です。

すべてのCシナリオでLambdaの表現と機能者を交換可能に使用できますか?そうでない場合は、なぜですか?

いいえ、Lambda ExpressionsとFunctorsを常に交換可能に使用することは常にできません。どちらも関数オブジェクトを表しますが、機能は異なります。 Lambdasは、簡潔でインラインの性質に優れており、短くて単純な操作に最適です。ただし、本格的なクラスの柔軟性はありません。クラスであるファンクターは、州の管理、メンバーの機能、再利用性をより強化しますが、より多くのボイラープレートコードを導入します。したがって、選択は特定のタスクの複雑さと要件に依存します。ステートフルオペレーションを備えた複雑な機能は、ファンチャーにより適していますが、ラムダの簡潔さからの単純で1回限りの使用操作のメリットがあります。

以上がCでLambda式と関数オブジェクト(ファンクター)を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート