Heim > Backend-Entwicklung > C++ > Wie kann ich eine Switch-Anweisung mit nicht ganzzahligen Argumenten in C/C effizient implementieren?

Wie kann ich eine Switch-Anweisung mit nicht ganzzahligen Argumenten in C/C effizient implementieren?

DDD
Freigeben: 2024-11-28 07:25:14
Original
947 Leute haben es durchsucht

How Can I Efficiently Implement a Switch Statement with Non-Integer Arguments in C/C  ?

Nicht-ganzzahlige Argumente in C/C-Switch-Anweisungen

Die switch-Anweisung in C/C ist ein leistungsstarker Kontrollflussmechanismus, der eine effiziente Verzweigung basierend auf ganzzahligen Werten ermöglicht . Allerdings ist es oft wünschenswert, nicht-ganzzahlige Werte wie Strings oder Enums einzuschalten. Dies stellt eine Herausforderung dar, da Switch-Anweisungen nur ganzzahlige Argumente akzeptieren.

Traditionelle Ansätze

Ein traditioneller Ansatz zur Handhabung nicht ganzzahliger Switch-Argumente besteht darin, eine Folge von if-Anweisungen zu verwenden:

if( str == "foo" )      ...
else if( str == "bar" ) ...
else                    ...
Nach dem Login kopieren

Dieser Ansatz ist jedoch ineffizient, da er für n Fälle eine lineare Zeitkomplexität (O(n)) erfordert. Eine effizientere Lösung besteht darin, die nicht ganzzahligen Werte als ganze Zahlen darzustellen, entweder mithilfe von Karten oder verschachtelten ifs. Diese Ansätze können jedoch komplex und fehleranfällig sein.

Binäre Suche mit Makros

Mithilfe von Makros ist es möglich, eine abgerollte binäre Suche zur Kompilierungszeit zu implementieren, was eine schnelle und syntaktische Optimierung ermöglicht -freundlicher Ansatz:

#define NEWMATCH
#define MATCH("asd")
  some c++ code
#define MATCH("bqr")
  ... the buffer for the match is in _buf
#define MATCH("zzz")
  ...  user.YOURSTUFF 
#define ENDMATCH(xy_match)
Nach dem Login kopieren

Dieses Makro generiert eine Funktion, die eine Zeichenfolge als Eingabe verwendet und einen booleschen Wert zurückgibt, wodurch eine binäre Suche durch die angegebenen Daten implementiert wird Fälle.

C 11 Lambdas und Initialisierungslisten

In C 11 bieten Lambdas und Initialisierungslisten einen eleganteren und prägnanteren Ansatz:

template<typename KeyType, typename FunPtrType>
void switchStatement(const KeyType& value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws) {
    std::lower_bound(sws.begin(), sws.end(), value, [&](const auto& a, const auto& b) { return a.first < b.first; });
    if (r != sws.end() && !cmp(val, *r)) { r->second(); } // else: not found
}
Nach dem Login kopieren
int main() {
    switchStatement<const char*, void(*())>("ger", {
        { "asdf", []{ printf("0\n"); } },
        { "bde", []{ printf("1\n"); } },
        { "ger", []{ printf("2\n"); } },
    });
    return 0;
}
Nach dem Login kopieren

Kompilierungszeit Trie

In modernem C können C 11-Metaprogrammierungstechniken verwendet werden, um einen Trie zur Kompilierungszeit zu erstellen Erweiterte Datenstruktur, die unsortierte Fallzweige effizient verarbeiten kann:

#include <smile/cttrie/cttrie.h>

using namespace smile::cttrie;

// Define cases as string literals
trie<true, void()> s = {"foo", "bar"};

int main() {
  // Switch on a string
  s.switch_on("foo", []() { std::cout << "foo" << std::endl; });
  return 0;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich eine Switch-Anweisung mit nicht ganzzahligen Argumenten 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage