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.

Ordenando vector de punteros únicos

Hola, soy nuevo en c++ y me quedé atascado cuando intenté ordenar un vector de unique pointers. Tengo una clase base y clases derivadas (aquí hay una).

class Item
{
public:
    virtual void printData() {}
};

class IntItem : public Item
{

public:
    int data;
    IntItem(int data)
    {
        this->data = data;
    }
    void printData()
    {
        std::cout << data;
    }
};
struct intItemCompare
{
    inline bool operator()(std::unique_ptr<intitem>& a, std::unique_ptr<intitem>& b)
    {
        return a->data < b->data;
    }
};

y tengo std::vector<><item>> data; donde se almacenan punteros únicos de objetos de las clases derivadas, NO de la clase Item (por ejemplo, un objeto IntItem).

Los datos se agregan al vector de la siguiente manera:

std::unique_ptr<intitem> newItem = std::make_unique<intitem>(10); // 10 es solo un número aleatorio
data.push_back(std::move(newItem));

Y quiero ordenarlo con std::sort(data.begin(),data.end(),intItemCompare());
Uno de los errores es:
no known conversion for argument 1 from ‘std::unique_ptr<item>’ to ‘std::unique_ptr<intitem>&’
41 | inline bool operator()(std::unique_ptr<intitem>& a, std::unique_ptr<intitem>& b)

Puedo agregar el mensaje de error completo si es necesario.

¿Cómo debo implementarlo? ¿Lo estoy haciendo completamente mal? Gracias por cualquier ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás tratando de ordenar un vector de punteros únicos a objetos de clases derivadas, pero tu operador de comparación solo está definido para punteros únicos a objetos de la clase IntItem. Para hacer que el operador de comparación funcione para objetos de todas las clases derivadas, puedes modificarlo para usar un parámetro de tipo de plantilla en lugar de un tipo fijo:

    template<typename t="">
    struct itemCompare
    {
        inline bool operator()(const std::unique_ptr<t>& a, const std::unique_ptr<t>& b)
        {
            return *a < *b; // Suponiendo que las clases derivadas definen un operador <
        }
    };
    

    Luego puedes usarlo de la siguiente manera:

    std::vector<><item>> data;
    
    std::unique_ptr<intitem> intItem = std::make_unique<intitem>(10);
    std::unique_ptr<someotheritem> otherItem = std::make_unique<someotheritem>(...);
    data.push_back(std::move(intItem));
    data.push_back(std::move(otherItem));
    
    std::sort(data.begin(), data.end(), itemCompare<item>());
    

    Ten en cuenta que necesitas definir un operador de comparación para las clases derivadas, o alternativamente pasar una función lambda a std::sort que compare los objetos directamente en lugar de usar el operador<.

Comments are closed.