Cómo usar los parámetros automáticos lambda en C++ 11

3 minutos de lectura

Como usar los parametros automaticos lambda en C 11
A. Juan

Tengo un código en C++14. Sin embargo, cuando lo usé en C++ 11, tiene un error en const auto. ¿Cómo usarlo en C++ 11?

vector<vector <int> > P;  
std::vector<double> f;
vector< pair<double, vector<int> > > X; 
for (int i=0;i<N;i++)
        X.push_back(make_pair(f[i],P[i]));

////Sorting fitness descending order
stable_sort(X.rbegin(), X.rend());
std::stable_sort(X.rbegin(), X.rend(),
                [](const auto&lhs, const auto& rhs) { return lhs.first < rhs.first; });

  • Sí, las ediciones que cambian fundamentalmente la pregunta realmente no son apropiadas aquí, las eliminé. Entiendo que no publicas mucho aquí y que lo que hiciste es comúnmente aceptado en los foros, por lo que puedo entender por qué lo hizo, pero está bien hacer muchas preguntas separadas relacionadas aquí, siempre que sean buenas preguntas que tengan sentido por sí mismas.

    usuario743382

    06 may. 15 en 08:47

1641757241 99 Como usar los parametros automaticos lambda en C 11
lemes

C++ 11 no es compatible lambdas genéricas. eso es lo que auto en la lista de parámetros de lambda en realidad significa: un parámetro genérico, comparable a los parámetros en una plantilla de función. (Tenga en cuenta que el const no es el problema aquí.)

Nota: C++14 lo hace apoyar lambdas con auto, const autoetc. Puedes leer al respecto aquí.

tienes básicamente dos opciones:

  1. Escriba el tipo correcto en vez de auto. Aquí está el tipo de elemento de Xcual es pair<double, vector<int>>. Si encuentra esto ilegible, un typedef puede ayudar.

    std::stable_sort(X.rbegin(), X.rend(),
                     [](const pair<double, vector<int>> & lhs,
                        const pair<double, vector<int>> & rhs)
                     { return lhs.first < rhs.first; });
    
  2. Reemplace la lambda con un funtor que tiene un plantilla de operador de llamada. Así es como las lambdas genéricas se implementan básicamente detrás de escena. La lambda es muy genérica, así que considere ponerla en algún encabezado de utilidad global. (Sin embargo, no using namespace std; pero escribe std:: en caso de que lo pongas en un encabezado.)

    struct CompareFirst {
        template <class Fst, class Snd>
        bool operator()(const pair<Fst,Snd>& l, const pair<Fst,Snd>& r) const {
            return l.first < r.first;
        }
    };
    
    std::stable_sort(X.rbegin(), X.rend(), CompareFirst());
    

Como usar los parametros automaticos lambda en C 11
Nim

Sé que hay una respuesta aceptada, pero también puedes usar decltype en C++ 11 para esto, se ve un poco desordenado…

stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; });

Usar cbegin() aquí como obtienes la const correcta value_type del contenedor

1641757241 454 Como usar los parametros automaticos lambda en C 11
Rico L

Desafortunadamente, las lambdas genéricas que toman auto (ya sea const o no) es una característica exclusiva de C++14.

Mira aquí https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas para algunos detalles más.

Alternativamente, puede utilizar directamente el value_type typedef del contenedor con un decltypeme gusta

std::stable_sort(X.rbegin(), X.rend(),
                 [](const decltype(X)::value_type & lhs, 
                    const decltype(X)::value_type & rhs)
                    {return lhs.first < rhs.first; }
                );

const auto no se admite en C++11 como parámetro lambda (en realidad, las lambdas genéricas no se admiten en C++11).

Arreglar:

using pair_type = std::pair<double, std::vector<int>>;
vector<pair_type> X;

std::stable_sort(X.rbegin(), X.rend(),
                [](const pair_type&lhs, const pair_type& rhs)
                { return lhs.first < rhs.first; });

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad