std::list<>::sort() : Pourquoi le passage soudain à une stratégie descendante ?
Le passage de un tri par fusion ascendant vers le haut dans std::list<>::sort() est apparu pour répondre au besoin d'un tri plus robuste et plus sécurisé contre les exceptions. L'implémentation précédente utilisait un tableau de listes internes, mais cela pourrait rencontrer des problèmes en raison de l'introduction d'allocateurs avec état et non constructibles par défaut dans VS2015.
Pour contourner cela, Stephan T. Lavavej de Microsoft a suggéré d'utiliser des itérateurs pour garder une trace des limites d'exécution dans la liste chaînée d'origine. Cela permet d'utiliser std::list::splice pour déplacer les nœuds dans la liste pendant les opérations de fusion, garantissant ainsi la sécurité des exceptions. Bien que ce changement améliore la robustesse, il entraîne un coût en termes de performances, car l'analyse d'une liste chaînée pour trouver le point médian peut s'avérer inefficace.
Cependant, dans la mise à jour de Visual Studio 2022, Microsoft a amélioré l'implémentation descendante en passer à une stratégie récursive plus efficace où les tailles entières sont simplement réduites de moitié plutôt que de parcourir la liste. Cette modification préserve les avantages de la sécurité des exceptions et évite la pénalité de performances liée aux appels répétés à std::next.
Comme alternative à l'approche descendante, certains développeurs ont proposé d'utiliser un tri par fusion ascendant avec itérateurs, comme introduit plus tôt dans ce document. Cette approche utilise également des itérateurs mais fonctionne de manière ascendante, éliminant ainsi le besoin de parcourir la liste pour trouver le point médian. L'implémentation spécifique dépend de la taille de la liste et de la distribution des nœuds, avec des compromis entre la complexité temporelle et spatiale.
Bien que le tri par fusion descendant reste la valeur par défaut dans std::list<> ::sort(), l'implémentation modifiée dans VS2022 vise à fournir un équilibre entre efficacité et sécurité des exceptions. Les développeurs peuvent explorer des implémentations alternatives, telles que le tri par fusion ascendant avec des itérateurs, en fonction des exigences spécifiques de leur application.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!