es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué C++ devuelve un error cuando uso mi constructor personalizado en una cola de prioridad?

#include <queue>

std::priority_queue<><int, int="">, std::vector<><int, int="">>, bool (*)(std::pair<int, int="">&, std::pair<int, int="">&)> pq;

static bool comparator(std::pair<int, int="">& m, std::pair<int, int="">& n) {
    if (m.second < n.second) return true;
    else return false;
}

Error:
Imagen de error

He definido mi comparador dentro de una clase, e intento declarar la cola de prioridad dentro de otra función de la misma clase, y ocurre el error.</int,></int,></int,></int,></int,></int,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Explicación:
    El error mostrado en la imagen se debe a que la función comparadora se declara como una función miembro estática dentro de una clase. Al declarar una priority_queue con un comparador personalizado, la función comparadora debe ser una función independiente o una función lambda.

    Si quieres usar una función miembro estática como comparador, necesitas declararla fuera de la clase o usar una función auxiliar para llamar a la función miembro estática.

    Una posible solución es declarar la función comparadora fuera de la clase como una función independiente y pasarla como argumento en la declaración de priority_queue:

    “`c++
    bool myComparator(pair<int, int=””> &m, pair<int, int=””> &n) {
    if (m.second < n.second) return true;
    else return false;
    }

    class MyClass {
    public:
    void myFunction() {
    priority_queue<><int, int=””>, vector<><int,int>>, decltype(&myComparator)> pq(&myComparator);
    // resto del código
    }
    };


    Otra solución es declarar una función auxiliar como una función miembro que llama a la función miembro estática y pasarla como comparador: ```c++ class MyClass { public: static bool comparator(pair<int, int=""> &m, pair<int, int=""> &n) { if (m.second < n.second) return true; else return false; } bool myHelper(pair<int, int=""> &m, pair<int, int=""> &n) { return comparator(m, n); } void myFunction() { priority_queue<><int, int="">, vector<><int,int>>, decltype(&MyClass::myHelper)> pq(&MyClass::myHelper); // resto del código } };

    Ten en cuenta que cuando se utiliza una función miembro como comparador, necesitas utilizar decltype para especificar el tipo del comparador.</int,int></int,></int,></int,></int,></int,></int,int></int,></int,></int,>

Comments are closed.