Maison > développement back-end > C++ > Comment utiliser les expressions lambda et les objets de fonction (Fonctors) en C?

Comment utiliser les expressions lambda et les objets de fonction (Fonctors) en C?

Robert Michael Kim
Libérer: 2025-03-12 16:54:15
original
811 Les gens l'ont consulté

Comment utiliser les expressions lambda et les objets de fonction (Fonctors) en C

Les expressions Lambda fournissent un moyen concis de créer des objets de fonction anonymes. Ils sont définis en ligne, souvent dans le contexte où ils sont utilisés. La syntaxe ressemble généralement à ceci:

 <code class="c  ">[capture list](parameter list) -> return type { function body };</code>
Copier après la connexion
  • Liste de capture: Spécifie les variables de la portée environnante accessible dans la lambda. Les options incluent:

    • [] : Ne capture rien.
    • [=] : Capture toutes les variables dans la portée environnante par valeur.
    • [&] : Capture toutes les variables dans la portée environnante par référence.
    • [=, &var1, &var2] : capture tout par valeur sauf var1 et var2 , qui sont capturés par référence.
    • [var1, &var2] : capture var1 par valeur et var2 par référence.
  • Liste des paramètres: similaire aux paramètres de fonction réguliers.
  • Type de retour: peut être explicitement spécifié après -> , ou implicitement déduit par le compilateur.
  • Corps de fonction: le code exécuté par le lambda.

Exemple:

 <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>
Copier après la connexion

Les fonds, ou objets de fonction, sont des classes qui surchargent l'opérateur d'appel de fonction ( operator() ). Cela permet aux instances de la classe d'être appelés comme des fonctions.

Exemple:

 <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>
Copier après la connexion

Quelles sont les différences pratiques entre l'utilisation d'expressions et de fonds de lambda en C?

La principale différence réside dans la concision et la portée. Les expressions de lambda sont beaucoup plus compactes pour des opérations simples, éliminant la nécessité de définir une classe distincte. Ils sont également implicitement définis dans leur portée, ce qui les rend idéaux pour les opérations ponctuelles. Les fonds, en revanche, sont des classes explicitement définies, permettant une logique plus complexe, des variables membres pour maintenir l'état et une réutilisation potentielle sur plusieurs parties du code. Les lambdas sont généralement limitées dans leur capacité à maintenir un état au-delà de ce qui est capturé de leur portée environnante. Les fonds peuvent avoir des variables membres pour stocker et manipuler l'état tout au long de leur cycle de vie.

Quand devrais-je préférer les expressions lambda aux fonds, ou vice versa, en c?

Préférez les expressions de lambda lorsque:

  • Vous avez besoin d'une fonction simple, courte et anonyme qui n'est utilisée qu'une seule fois.
  • Vous devez capturer des variables de la portée environnante.
  • La concision est une priorité.

Préférez les fonds lorsque:

  • Vous avez besoin d'une fonction plus complexe avec plusieurs méthodes ou état interne.
  • Vous devez réutiliser la fonction en plusieurs parties de votre code.
  • Vous devez maintenir l'état entre les appels de fonction.
  • Vous avez besoin de fonctionnalités plus avancées telles que l'héritage ou le polymorphisme.

Puis-je utiliser des expressions et des fonds de lambda de manière interchangeable dans tous les scénarios C, et sinon, pourquoi pas?

Non, vous ne pouvez pas toujours utiliser des expressions et des fonds de lambda de manière interchangeable. Bien qu'ils représentent tous deux des objets de fonction, leurs capacités diffèrent. Les lambdas excellent dans leur brièveté et leur nature en ligne, idéale pour les opérations courtes et simples. Cependant, ils n'ont pas la flexibilité des classes à part entière. Les fonds, étant des classes, fournissent plus de contrôle sur la gestion de l'État, les fonctions des membres et la réutilisabilité, mais ils introduisent plus de code de passe-partout. Par conséquent, le choix dépend de la complexité et des exigences de la tâche spécifique. Une fonction complexe avec des opérations avec état est mieux adaptée à un fonctor, tandis qu'une simple opération d'utilisation unique bénéficie de la brièveté d'une Lambda.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal