Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap dengan Argumen Bukan Integer dalam C/C ?

Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap dengan Argumen Bukan Integer dalam C/C ?

DDD
DDDasal
2024-11-28 07:25:14925semak imbas

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

Argumen Bukan Integer dalam Pernyataan Suis C/C

Pernyataan suis dalam C/C ialah mekanisme aliran kawalan berkuasa yang membolehkan percabangan yang cekap berdasarkan nilai integer . Walau bagaimanapun, selalunya wajar untuk menghidupkan nilai bukan integer, seperti rentetan atau enum. Ini memberikan cabaran kerana pernyataan suis hanya menerima argumen integer.

Pendekatan Tradisional

Satu pendekatan tradisional untuk mengendalikan argumen suis bukan integer ialah menggunakan urutan pernyataan if:

if( str == "foo" )      ...
else if( str == "bar" ) ...
else                    ...

Walau bagaimanapun, pendekatan ini tidak cekap kerana ia memerlukan kerumitan masa linear (O(n)) untuk n kes. Penyelesaian yang lebih cekap ialah mewakili nilai bukan integer sebagai integer, sama ada menggunakan peta atau ifs bersarang. Walau bagaimanapun, pendekatan ini boleh menjadi rumit dan terdedah kepada ralat.

Carian Perduaan dengan Makro

Menggunakan makro, adalah mungkin untuk melaksanakan carian binari yang dibuka pada masa penyusunan, membolehkan sintaks yang pantas dan -pendekatan mesra:

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

Makro ini akan menjana fungsi yang mengambil rentetan sebagai input dan mengembalikan boolean, melaksanakan carian binari melalui kes yang ditentukan.

Senarai lambda dan pemula C 11

Dalam C 11, senarai lambdas dan pemula menawarkan pendekatan yang lebih elegan dan ringkas:

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

Kompilasi Time Trie

Dalam C , C 11 moden teknik metaprogramming boleh digunakan untuk mencipta percubaan masa kompilasi, struktur data lanjutan yang boleh mengendalikan cawangan kes yang tidak diisih dengan cekap:

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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap dengan Argumen Bukan Integer dalam C/C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn