2017-03-24 1 views
2

gars sagesmême code, un ordre différent si ex aequo en priority, en utilisant clang et gcc

Ma question était comme ça:

Je dois utiliser priority de std, tout fonctionne bien, jusqu'à ce que s'il existe liens entre mes enregistrements, l'ordre n'est plus long si je compile en utilisant clang comparé à la compilation sur gcc.

ma fonction de comparaison est simple:

bool comparator(const max_pair_t &lhs, const max_pair_t &rhs) { 
    return lhs.pval < rhs.pval; 
} 

qui est tout.

Existe-t-il un moyen de résoudre ce problème?

PS: J'imprimé tous les enregistrements à l'aide de deux excutables binaires, et comparé du côté de commande côte à côte, l'ordre est différent, mais les dossiers liés sont dans la zone voisine

+1

Pouvez-vous d'abord nous convaincre s'il y a * un * problème? Quelle partie de la norme vous a fait croire qu'il y a un ordre portable parmi les éléments liés dans un tas? Êtes-vous sûr de vouloir réellement une file d'attente prioritaire, et non une autre structure de données? –

+1

Si elles ont la même priorité, quelle différence fait-elle dans quel ordre elles sont traitées? – Barmar

+0

@Barmar Parce que j'ai besoin que le résultat soit reproductible, le plus important, j'ai besoin que les deux versions génèrent un résultat cohérent. – Griffan

Répondre

2

std::priority_queue ne donne aucune garantie quant à la stabilité de tri . Si vous avez besoin de stabilité de tri, vous devrez le fournir vous-même, par ex. en stockant une valeur augmentant ou diminuant progressivement (cela n'a pas vraiment d'importance, cela change simplement la direction de la comparaison de repli) qui est utilisée lorsque la clé de comparaison principale est égale, et en l'effaçant lorsque vous sortez de la file d'attente.