Heim >Backend-Entwicklung >C++ >Wie kann ich nicht ganzzahlige Konstanten in einer C/C-Switch-Anweisung effizient verarbeiten?
Beim Arbeiten mit Nicht-POD-Konstanten (Plain Old Data) ist es notwendig, zwischen verschiedenen Codepfaden zu wählen basierend auf dem Wert der Konstante. Die herkömmliche Switch-Anweisung akzeptiert jedoch nur ganzzahlige Werte. Dies stellt eine Herausforderung für die Auswahl zwischen nicht ganzzahligen Konstanten dar.
Traditioneller Ansatz: Verschachtelte if-Anweisungen
Eine einfache Möglichkeit, damit umzugehen, besteht darin, eine Reihe verschachtelter if-Anweisungen zu verwenden Aussagen wie:
if( str == "foo" ) ... else if( str == "bar" ) ... else ...
Obwohl dies unkompliziert ist, kann es in vielen Fällen umständlich und ineffizient werden hat eine O(n)-Komplexität, wobei „n“ die Anzahl der Fälle ist.
Erweiterte Techniken
Um eine bessere Effizienz zu erreichen, können fortgeschrittenere Techniken eingesetzt werden. Ein Ansatz besteht darin, Datenstrukturen wie Karten zu verwenden, um Zeichenfolgen als Ganzzahlen darzustellen, und dann eine Standard-Switch-Anweisung zu verwenden. Dies führt jedoch zu zusätzlicher Codierungskomplexität.
Magie zur Kompilierungszeit: Makro- und Vorlagenmagie
Ein einzigartiger Ansatz besteht darin, Makro- und Vorlagenmagie zu verwenden, um eine entrollte Binärdatei zu generieren Suche zur Kompilierungszeit. Bibliotheken wie fastmatch.h können eine saubere Syntax zum Definieren von Fallübereinstimmungen bereitstellen:
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)
Dies generiert eine Funktion wie xy_match(char *&_buf, T &user), die problemlos aufgerufen werden kann.
C 11-Updates: Lambdas und Initialisiererliste
Mit C 11, Lambdas und Initialisierungslisten bieten eine sauberere Lösung:
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; });
Dieser Ansatz nutzt eine binäre Suche auf einer sortierten Liste von Fallübereinstimmungen und sorgt so für eine effiziente O(log n)-Komplexität.
Versuche zur Kompilierungszeit
Als weiterer Fortschritt können Versuche zur Kompilierungszeit genutzt werden, um unsortiert zu verarbeiten Fallzweige. Dieser Ansatz nutzt erweiterte C11-Metaprogrammierung, um zur Kompilierungszeit einen Suchversuch zu generieren. Jeder Trie-Knoten enthält eine Switch-Anweisung zur Optimierung der Codegenerierung.
Die Implementierung finden Sie auf GitHub unter lächelndthax/cttrie.
Das obige ist der detaillierte Inhalt vonWie kann ich nicht ganzzahlige Konstanten in einer C/C-Switch-Anweisung effizient verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!