Heim > Backend-Entwicklung > C++ > Wie kann ich eine Switch-Anweisung für nicht ganzzahlige Werte in C/C effizient implementieren?

Wie kann ich eine Switch-Anweisung für nicht ganzzahlige Werte in C/C effizient implementieren?

Linda Hamilton
Freigeben: 2024-12-04 09:08:15
Original
199 Leute haben es durchsucht

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

Nicht-ganzzahlige Werte in C/C einschalten

Problem:

Aktionen bestimmen Basierend auf Nicht-POD-Konstantelementen (z. B. Zeichenfolgen) sind Problemumgehungen wie verschachtelte Ifs erforderlich, die ineffizient und komplex sein können. Die für ganzzahlige Werte konzipierte Switch-Anweisung unterstützt Nicht-Ganzzahlen nicht direkt.

Lösung 1: Makro- und Vorlagenmagie (fastmatch.h)

Verwenden von Makros und Mithilfe von Vorlagen kann man zur Kompilierzeit eine abgerollte binäre Suche erstellen. Die Syntax ist prägnant, erfordert jedoch sortierte Groß-/Kleinschreibungszweige. Dieser Ansatz generiert eine Funktion mit impliziten Unterbrechungen, die die entsprechende Übereinstimmung einem Puffer zuweist.

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);
Nach dem Login kopieren

Lösung 2: C 11 Lambdas und Initialisierungslisten

In C 11 , Lambdas und Initialisierungslisten bieten eine sauberere Lösung. Dieser Ansatz führt eine binäre Suche in einer Liste von Schlüssel-Wert-Paaren durch, wobei der Schlüssel dem nicht ganzzahligen Wert entspricht und der Wert ein Funktionszeiger ist. Die gefundene Funktion wird dann aufgerufen.

#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;});
Nach dem Login kopieren

Lösung 3: Compile Time Trie (cttrie)

In C 11 kann ein Kompilierungszeit-Trie-Ansatz unsorted verarbeiten Fall verzweigt sich mühelos. Fortgeschrittene Metaprogrammierungstechniken generieren zur Kompilierungszeit einen Suchversuch und nutzen dabei Switch-Anweisungen in jedem Trie-Knoten, um den Ausführungsfluss effizient umzuleiten.

Die vollständige Implementierung ist auf Github verfügbar: smilethax/cttrie.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Switch-Anweisung für nicht ganzzahlige Werte in C/C effizient implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage