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

C/C Switch ステートメントで非整数定数を効率的に処理するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-30 14:46:12
オリジナル
1020 人が閲覧しました

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

C/C で非整数定数を使用する切り替え

非 POD (Plain Old Data) 定数を使用する場合、異なるコード パスの間で選択する必要があります。定数の値に基づきます。ただし、従来の switch ステートメントは整数値のみを受け入れます。これは、非整数定数の選択に課題をもたらします。

従来のアプローチ: ネストされた if ステートメント

これを処理する簡単な方法は、一連のネストされた if を使用することです。次のようなステートメント:

if( str == "foo" )      ...
else if( str == "bar" ) ...
else                    ...
ログイン後にコピー

これは簡単ですが、数が多いと面倒で非効率になる可能性があります。 「n」はケースの数です。

高度なテクニック

効率を高めるために、より高度なテクニックを使用すると、雇用される。 1 つのアプローチでは、マップなどのデータ構造を使用して文字列を整数として表現し、その後標準の switch ステートメントを使用します。ただし、これによりコーディングがさらに複雑になります。

コンパイル時のマジック: マクロとテンプレートのマジック

独自のアプローチは、マクロとテンプレートのマジックを使用してアンロールされたバイナリを生成することです。コンパイル時に検索します。 fastmatch.h のようなライブラリは、大文字と小文字の一致を定義するための明確な構文を提供できます。

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)
ログイン後にコピー

これにより、簡単に呼び出すことができる xy_match(char *&_buf, T &user) のような関数が生成されます。

C 11 アップデート: ラムダとイニシャライザList

C 11 では、ラムダと初期化子リストがよりクリーンなソリューションを提供します。

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; });
ログイン後にコピー

このアプローチでは、大文字と小文字の一致のソートされたリストで二分検索を利用し、効率的な O( log n) の複雑さ。

コンパイル時間Trie

さらなる進歩として、コンパイル時の Try を活用して、ソートされていないケース分岐を処理できます。このアプローチでは、高度な C11 メタプログラミングを使用して、コンパイル時に検索トライを生成します。各 trie ノードには、コード生成を最適化するための switch ステートメントが含まれています。

実装は、GitHub の smilethax/cttrie にあります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート