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.

Usando std::less para un conjunto de punteros.

Tengo una clase donde estoy declarando un conjunto de la siguiente manera:

std::set<upfir::retentionsignal*> _retSignalSet;

Estoy intentando usar la función de comparación std::less en él. Intenté algo como esto:

std::set<upfir::retentionsignal*,></upfir::retentionsignal*,><upfir::retentionsignal*>> _retSignalSet;

El feedback que estoy recibiendo es “agregar std::less no lo hará determinista. Debes comparar el nombre”. ¿Alguien puede explicarme cómo se puede lograr esto ya que no he trabajado con std::less antes?

Gracias</upfir::retentionsignal></upfir::retentionsignal>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El feedback que recibiste es correcto. Agregar std::less como un comparador no necesariamente hará que el conjunto sea determinístico. La función de comparación utilizada por std::set debe definir un orden estrictamente débil, lo que significa que debe definir un orden total y no permitir ambigüedad ni inconsistencias.

    La forma más fácil de lograr esto cuando se trabaja con punteros es definir una función de comparación personalizada que compare los objetos apuntados por los punteros. Aquí tienes un ejemplo:

    struct ComparePtr {
      bool operator()(UPFIR::RetentionSignal* a, UPFIR::RetentionSignal* b) const {
        return *a < *b; // compara los objetos apuntados por a y b
      }
    };
    
    std::set<upfir::retentionsignal*, compareptr=""> _retSignalSet;
    

    Aquí, definimos un objeto de función de comparación ComparePtr que toma dos punteros a objetos UPFIR::RetentionSignal y compara los objetos mismos utilizando el operador menor que definido para la clase UPFIR::RetentionSignal. Luego, usamos este objeto de función de comparación como el comparador para nuestro conjunto.

    Esto garantiza un orden total en los objetos del conjunto y debería hacerlo determinístico.</upfir::retentionsignal*,>

Comments are closed.