2016-03-01 3 views
0

Le code suivant donne une erreur de segmentation, quelqu'un pourrait-il m'éclairer? Tout ce que je voulais faire est d'avoir une file d'attente prioritaire triée par ordre croissant de tv.t ou par ordre décroissant de tv.m.priority_queue emplace donne la faute de segmentation

struct tv { 
    int m; 
    int c; 
    int t; 
    tv(int mm, int cc, int tt): m(mm), c(cc), t(tt) {} 
}; 


bool comp(struct tv & t1 , struct tv & t2) { 
    if (t1.t == t2.t) { 
     return t1.m < t2.m; 
    } 
    return t1.t > t2.t; 
} 


int main(int argc, char** argv) { 
    priority_queue<struct tv, vector<struct tv>, decltype(&comp)> q; 
    q.emplace(0, 0, 0); 
    q.emplace(1, 0, 0); 
    q.emplace(1, 1, 1); 
    q.emplace(1, 2, 0); 
    return 0; 
} 

Répondre

2

Vous avez donné votre priorité la file d'attente d'un type de comparaison dans la liste des arguments de modèle, mais vous ne lui donne pas un comparateur réel dans le constructeur.

priority_queue<tv, vector<tv>, decltype(&comp)> q(comp); 

Comme vous l'avez, il appelle un pointeur de fonction null. C'est une bonne chose à propos de l'utilisation d'objets de fonction au lieu de pointeurs de fonction. Ils peuvent être construits par défaut et faire la bonne chose.

struct comp_t { 
    bool operator()(const tv & t1 , const tv & t2) const { 
     if (t1.t == t2.t) { 
      return t1.m < t2.m; 
     } 
     return t1.t > t2.t; 
    } 
}; 

priority_queue<tv, vector<tv>, comp_t> q;