Maison > développement back-end > C++ > Comment puis-je implémenter efficacement une instruction Switch en C pour des constantes non entières ?

Comment puis-je implémenter efficacement une instruction Switch en C pour des constantes non entières ?

DDD
Libérer: 2024-12-03 11:07:09
original
977 Les gens l'ont consulté

How Can I Efficiently Implement a Switch Statement in C   for Non-Integer Constants?

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)
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal