Dev (Back & Front)ARTIGO

Trabalhando com lambda no C++11

Já apresentei algumas das últimas adições do C++11  à linguagem, como expressões regulares. Outra adição útil é o lambda, uma expressão lambda permite que você defina e use funções anônimas em linha (funções com um corpo mas sem um nome). Você pode usar uma expressão lambda em vez de uma função de objeto, evitando a necessidade de criar uma classe separada e uma definição de função. Este é um exemplo útil quando você precisa de uma expressão de uma linha para interagir com muitos dos algoritmos STL.

Expressões lambda estão disponível no  g++-4.6.x e no Visual Studio 2010, você não pode usar lambda com llvm e clang.

Vamos criar um simples (e inútil) exemplo de expressão lambda que irá retornar um número:

[]()->int{return 4;}();

Obviamente o código acima não fará nada visível (na verdade, ele retornará um número inteiro), podemos usá-lo para imprimir 4 no terminal:

int result=[]()->int{return 4;}();
cout<<result<<endl;

Um exemplo levemente mais útil que irá receber um número inteiro como entrada e irá retornar duas vezes esse número:

int result=[](int input)->int{return 2*input;}(10);
cout<<result<<endl;

A partir dos exemplos acima, a sintaxe de uma expressão lambda pode ser escrita (esta não é a sintaxe completa de uma expressão lambda):

[](input_paramter_declaration)->returned_type {body_of_the_lambda_expression}(parameters)

Uma expressão lambda que irá adicionar dois números e irá retornar o resultado pode ser escrito como:

int result=[](int a,int b)->int{return a+b;}(2,4);
cout<<result<<endl;

Podemos usar uma expressão lambda dentro de outra expressão lambda. Combinando os exemplos acima, podemos criar um exemplo levemente mais complexo:

int result=[](int m,int n)->int{return m+n;}([](int a)->int{return a;}(2),[](int a)->int{return a;}(3));
cout<<result<<endl;

Se você precisar usar mais de uma expressão lambda, poderia ser chato ter que copiar a mesma parte de código, você pode usar um apontador para a expressão lambda:

auto func=[](int a,int b)->int{return a+b;};
cout<<func(2,3)<<endl;

A auto keyword irá ser responsável por definir func como o apontador para a expressão lambda. Suponha que precisemos classificar um vetor de números inteiros; usando o algoritmo de classificação do C++98, isso pode ser implementado:

#include <iostream>
#include <vector>
#include <algorithm>

bool compare(int i,int j){return (i<j);}

using namespace std;

int main()
{
int n=10;
vector<int>v(n);
//initialize the vector with values from 10 to 1
for(int i=n,j=0;i>=0;i--,j++)v[j]=i;
//print the unsorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;
//sort the vector
sort(v.begin(),v.end(),compare);
//print the sorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;

return(0);
}

Usando uma expressão lambda, podemos conseguir o mesmo resultando evitando declarar uma função de comparação:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
int n=10;
vector<int>v(n);
//initialize the vector with values from 10 to 1
for(int i=n,j=0;i>=0;i--,j++)v[j]=i;
//print the unsorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;
//sort the vector
sort(v.begin(),v.end(),[](int i,int j)->bool{return (i<j);});
//print the sorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;

return(0);
}

Para aqueles interessados em aprender a nova sintaxe I do C++11, eu recomendo a leitura do Professional C++, de M. Gregoire, N. A. Solter e S. J. Kleper:

?

Texto original disponível em http://solarianprogrammer.com/2011/11/01/cpp-11-lambda-tutorial/

Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram/Threads @portalimasters

Ver perfil