C ++ Primer quinta notas (capítulo 14 operación de sobrecarga y conversión de tipo) objeto de función lambda

1. Definición

Lambda es un objeto de función: después de escribir un lambda, el compilador convertirá la expresión en un objeto sin nombre de una clase sin nombre, que contiene un operador de llamada de función sobrecargado.

p.ej.

stable_sort(words.begin(),words.end(),[](const string &a,const string &b)
{
    
    return a.size() < b.size();});

//等价于下面的类:
class ShorterString{
    
    
public:
	bool operator()(const string &a,const string &b)
	{
    
    return a.size() < b.size();}
};
stable_sort(words.begin(),words.end(),ShorterString());

Código de prueba:

std::vector<string> words = {
    
     "a31", "b1" };
stable_sort(words.begin(), words.end(), [](const string& a, const string& b)
    {
    
    return a.size() < b.size(); });    
for_each(words.begin(), words.end(), [](const string& s)
    {
    
    std::cout << s << endl; });
    
std::vector<string> words2 = {
    
     "a31", "b1" };
stable_sort(words2.begin(), words2.end(), ShorterString());
for_each(words2.begin(), words2.end(), [](const string& s)
    {
    
    std::cout << s << endl; });

El resultado de salida es

b1
a31
b1
a31

2. Representa la clase de lambda y el comportamiento de captura correspondiente.

La clase generada por lambda debe establecer un miembro de datos correspondiente para cada variable de valor capturado y crear un constructor al mismo tiempo.

p.ej.

auto wc = find_if(words.begin(),words.end(),[sz](const string &a)
	{
    
    return a.size() > = sz;})

//该 lambda 表达式产生的类将形如:
class SizeComp
{
    
    
	SizeComp(size_t n):sz(n) {
    
     }
	bool operator()(const string &s)const {
    
    return s.size() >= sz;}
private:
	size_t sz;
}; 

Código de prueba:

void lambda_functionObject_test2(vector<string>::size_type sz)    {
    
     
	 std::vector<string> words = {
    
     "a31", "b1" };
	 auto wc = find_if(words.begin(), words.end(), [sz](const string& a)
	            {
    
    return a.size() >= sz; });
	std::cout << *wc << endl;
	 
	auto wc2 = find_if(words.begin(), words.end(), SizeComp(sz));
	std::cout << *wc2 << endl;
}
lambda_functionObject_test2(3);

Resultado de salida:

a31
a31

3. Características

  • Lambda no puede cambiar las variables que captura de forma predeterminada. De forma predeterminada, el operador de llamada de función en la clase generada por lambda es una función miembro constante. Si la lambda se declara como mutable, el operador de llamada ya no es una función constante.
  • Cuando una variable es capturada por una referencia, el programa es responsable de garantizar que el objeto vinculado por la referencia exista cuando se ejecuta la lambda. Por lo tanto, el compilador puede usar directamente la referencia sin almacenarla como un miembro de datos en la clase generada por lambda.
  • La variable capturada por valor se copia a la lambda. En este momento, la clase generada por la lambda debe establecer un miembro de datos correspondiente para cada variable de valor capturada y crear un constructor para inicializar el miembro de datos con el valor de la variable capturada.
  • La clase generada por .lambda no contiene el constructor predeterminado, el operador de asignación y el destructor predeterminado. Si contiene un constructor de copia / movimiento predeterminado, generalmente depende del tipo de variable capturada.

[Cita]

[1] Código functionObject.h

Supongo que te gusta

Origin blog.csdn.net/thefist11cc/article/details/114162719
Recomendado
Clasificación