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

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

DDD
リリース: 2024-11-28 07:25:14
オリジナル
924 人が閲覧しました

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

C/C switch ステートメントの非整数引数

C/C の switch ステートメントは、整数値に基づいた効率的な分岐を可能にする強力な制御フロー メカニズムです。 。ただし、多くの場合、文字列や列挙型などの非整数値をオンにすることが望ましいです。 switch ステートメントは整数の引数のみを受け入れるため、これには課題があります。

従来のアプローチ

非整数 switch 引数を処理する従来のアプローチの 1 つは、一連の if ステートメントを使用することです。

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

ただし、このアプローチは n 件の線形時間計算量 (O(n)) を必要とするため、非効率的です。より効率的な解決策は、マップまたはネストされた if を使用して、非整数値を整数として表すことです。ただし、これらのアプローチは複雑でエラーが発生しやすい可能性があります。

マクロを使用した二分検索

マクロを使用すると、コンパイル時に展開された二分検索を実装でき、高速で構文の高速化が可能になります。 -フレンドリーなアプローチ:

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

このマクロは、文字列を入力として受け取り、ブール値を返す関数を生成します。指定されたケースによる二分検索を実装します。

C 11 のラムダと初期化子リスト

C 11 では、ラムダと初期化子リストにより、よりエレガントで簡潔なアプローチが提供されます。

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
}
ログイン後にコピー
int main() {
    switchStatement<const char*, void(*())>("ger", {
        { "asdf", []{ printf("0\n"); } },
        { "bde", []{ printf("1\n"); } },
        { "ger", []{ printf("2\n"); } },
    });
    return 0;
}
ログイン後にコピー

コンパイル時トライ

モダン C の場合, C 11 メタプログラミング手法を利用して、ソートされていないケース分岐を効率的に処理できる高度なデータ構造であるコンパイル時トライを作成できます:

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

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

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