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

Comment puis-je implémenter efficacement une instruction Switch pour les valeurs non entières en C/C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-04 09:08:15195parcourir

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

Activer les valeurs non entières en C/C

Problème :

Détermination des actions basé sur des éléments constants non POD (par exemple, des chaînes) nécessite des solutions de contournement telles que des ifs imbriqués, qui peuvent être inefficace et complexe. L'instruction switch, conçue pour les valeurs entières, ne prend pas directement en charge les valeurs non entières.

Solution 1 : Macro et Template Magic (fastmatch.h)

Utilisation de macros et modèles, on peut créer une recherche binaire déroulée au moment de la compilation. La syntaxe est concise, mais nécessite des branches de cas triées. Cette approche génère une fonction avec des ruptures implicites qui attribue la correspondance pertinente à un tampon.

MATCH("asd")
  some c++ code
MATCH("bqr")
  ... the buffer for the match is in _buf
MATCH("zzz")
  ...  user.YOURSTUFF 
/*ELSE 
  optional
*/
ENDMATCH(xy_match)

xy_match("bqr",youruserdata);

Solution 2 : C 11 Lambdas et listes d'initialisation

En C 11 , les lambdas et les listes d'initialisation fournissent une solution plus propre. Cette approche effectue une recherche binaire sur une liste de paires clé-valeur, où la clé correspond à la valeur non entière et la valeur est un pointeur de fonction. La fonction trouvée est ensuite invoquée.

#include <utility>
#include <algorithm>
#include <initializer_list>

template <typename KeyType, typename FunPtrType, typename Comp>
void Switch(const KeyType &amp;value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) {
  // ... search and invoke code
}

Switch("ger",{ 
    {"asdf",[]{ printf("0\n"); }},
    {"bde",[]{ printf("1\n"); }},
    {"ger",[]{ printf("2\n"); }}
  },[](const char *a,const char *b){ return strcmp(a,b)<0;});

Solution 3 : Compile Time Trie (cttrie)

En C 11, une approche de compilation au moment de la compilation peut gérer les fichiers non triés le cas se branche sans effort. Les techniques avancées de métaprogrammation génèrent un recherche-trie au moment de la compilation, en utilisant des instructions switch dans chaque nœud de trie pour rediriger efficacement le flux d'exécution.

L'implémentation complète est disponible sur github : smileingthax/cttrie.

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!

Déclaration:
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