ホームページ >バックエンド開発 >C++ >C/C で非整数値の switch ステートメントを効率的に実装するにはどうすればよいですか?

C/C で非整数値の switch ステートメントを効率的に実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-04 09:08:15195ブラウズ

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

C/C で非整数値をオンにする

問題:

アクションの決定非 POD 定数要素 (文字列など) に基づく場合は、ネストされたような回避策が必要ですifs は非効率的で複雑になる可能性があります。整数値用に設計された switch ステートメントは、非整数を直接サポートしません。

解決策 1: マクロとテンプレート マジック (fastmatch.h)

マクロとテンプレートの使用テンプレートを使用すると、コンパイル時に展開されたバイナリ検索を作成できます。構文は簡潔ですが、ソートされた大文字と小文字の分岐が必要です。このアプローチでは、関連する一致をバッファーに割り当てる暗黙的なブレークを含む関数が生成されます。

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);

解決策 2: C 11 のラムダと初期化子リスト

C 11 、ラムダおよび初期化子リストは、よりクリーンなソリューションを提供します。このアプローチでは、キーと値のペアのリストに対して二分検索が実行されます。ここで、キーは非整数値に対応し、値は関数ポインターです。次に、見つかった関数が呼び出されます。

#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;});

解決策 3: コンパイル時トライ (cttrie)

C 11 では、コンパイル時トライ アプローチで未ソートを処理できます。ケースは簡単に分岐します。高度なメタプログラミング技術により、コンパイル時に検索トライが生成され、各トライ ノードで switch ステートメントを利用して実行フローを効率的にリダイレクトします。

完全な実装は、github: smileingthax/cttrie で入手できます。

以上がC/C で非整数値の switch ステートメントを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。