C での非整数定数の switch ステートメントの実装 : テンプレートとマクロを使用した二分探索の展開
C の古典的な switch ステートメントは次のとおりです。整数値に基づいてアクションを選択する際の効率性で知られています。ただし、整数のみを使用するという制限により、非整数定数を扱うときに問題が発生する可能性があります。
問題: 遅くて複雑な代替手段
1 つのアプローチは、一連の if ステートメントを使用しますが、これは非効率的であり、維持するのが難しい場合があります。文字列を整数にマップするためにマップなどのデータ構造を使用すると、複雑さが増し、コーディングのオーバーヘッドが発生する可能性があります。
マクロとテンプレートを使用した高速でソートされた二分検索
高速を実現するには、クリーンでシンプルな実装なので、マクロとテンプレートの魔法を利用できます。 fastmatch.h ライブラリは、基本的にコンパイル時にバイナリ検索を展開するマクロベースのソリューションを提供します。構文は switch ステートメントに似ています。
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 が生成されます。ブレークは暗黙的であり、構文はソートされます。
更新: C 11 のラムダとイニシャライザ リストによる優雅さの強化
C 11 では、ラムダとイニシャライザ リストにより、より洗練されたソリューション:
#include <utility> #include <algorithm> #include <initializer_list> template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) { // ... implementation omitted for brevity }
このアプローチでは、値を比較するラムダ関数と正しいケースを検索する lower_bound アルゴリズム。
2016 年更新: 未ソートのケースのコンパイル時トライ
未ソートのケース ブランチの場合、より高度なソリューションでは、C 11 メタプログラミングでのコンパイル時のトライ生成を利用します。この実装は、GitHub の cttrie ライブラリで入手できます。
コンパイラの高度なコード ジェネレーターを利用することで、このアプローチは検索プロセスを大幅に最適化し、入力として整数を必要とする switch ステートメントに匹敵するパフォーマンスを提供します。
以上がC で非整数定数の switch ステートメントを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。