Heim >Backend-Entwicklung >C++ >Wie kann ich nicht ganzzahlige Konstanten in einer C/C-Switch-Anweisung effizient verarbeiten?

Wie kann ich nicht ganzzahlige Konstanten in einer C/C-Switch-Anweisung effizient verarbeiten?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-30 14:46:12948Durchsuche

How Can I Efficiently Handle Non-Integer Constants in a C/C   Switch Statement?

Umschalten mit nicht-ganzzahligen Konstanten in C/C

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!

Stellungnahme:
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