Implémentation d'une instruction Switch pour les constantes non entières en C : déroulement de la recherche binaire avec des modèles et des macros
L'instruction switch classique en C est connu pour son efficacité lors de la sélection d'actions basées sur des valeurs entières. Cependant, la limitation de l'utilisation uniquement de nombres entiers peut poser des problèmes lorsqu'il s'agit de constantes non entières.
Le problème : des alternatives lentes et complexes
Une approche consiste à utiliser un série d'instructions if, mais cela peut être inefficace et difficile à maintenir. L'utilisation de structures de données telles que des mappages pour mapper des chaînes en entiers pourrait introduire une complexité et une surcharge de codage supplémentaires.
Recherche binaire rapide et triée avec des macros et des modèles
Pour obtenir une recherche binaire rapide, implémentation propre et simple, on peut utiliser la magie des macros et des modèles. La bibliothèque fastmatch.h fournit une solution basée sur des macros qui déroule essentiellement une recherche binaire au moment de la compilation. La syntaxe est similaire à une instruction switch :
NEWMATCH MATCH("asd") some c++ code MATCH("bqr") ... the buffer for the match is in _buf MATCH("zzz") ... user.YOURSTUFF /*ELSE optional */ ENDMATCH(xy_match)
Cela génère une fonction xy_match qui effectue une recherche binaire sur les cas fournis. Les ruptures sont implicites et la syntaxe est triée.
Mise à jour : C 11 Lambdas et listes d'initialisation pour une élégance améliorée
Avec C 11, les lambdas et les listes d'initialisation fournissent un solution plus élégante :
#include <utility> #include <algorithm> #include <initializer_list> template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) { // ... implementation omitted for brevity }
Cette approche utilise une fonction lambda pour comparer des valeurs et un algorithme lower_bound pour rechercher le cas correct.
Mise à jour 2016 : essai au moment de la compilation pour les cas non triés
Pour les branches de cas non triées, une solution plus avancée utilise le temps de compilation génération de trie en métaprogrammation C 11. L'implémentation est disponible dans la bibliothèque cttrie sur GitHub.
En exploitant le générateur de code avancé du compilateur, cette approche optimise considérablement le processus de recherche, offrant des performances comparables à une instruction switch qui nécessiterait des entiers en entrée.
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!