Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap dengan Argumen Bukan Integer dalam 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.
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.
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.
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; }
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!