Apabila bekerja dengan pemalar bukan POD (Data Lama Biasa), ia menjadi perlu untuk memilih antara laluan kod yang berbeza berdasarkan nilai pemalar. Walau bagaimanapun, pernyataan suis tradisional hanya menerima nilai integer. Ini memberikan cabaran untuk memilih antara pemalar bukan integer.
Pendekatan Tradisional: Penyata jika Bersarang
Cara mudah untuk mengendalikan perkara ini ialah menggunakan siri jika bersarang kenyataan, seperti:
if( str == "foo" ) ... else if( str == "bar" ) ... else ...
Walaupun ini mudah, ia boleh menjadi rumit dan tidak cekap untuk sejumlah besar kes, kerana ia mempunyai kerumitan O(n) dengan "n" ialah bilangan kes.
Teknik Lanjutan
Untuk mencapai kecekapan yang lebih baik, teknik yang lebih maju boleh digunakan. Satu pendekatan melibatkan penggunaan struktur data seperti peta untuk mewakili rentetan sebagai integer dan kemudian menggunakan pernyataan suis standard. Walau bagaimanapun, ini memperkenalkan kerumitan pengekodan tambahan.
Sihir Masa Kompilasi: Sihir Makro dan Templat
Pendekatan unik ialah menggunakan sihir makro dan templat untuk menjana binari yang dibuka carian pada masa penyusunan. Perpustakaan seperti fastmatch.h boleh menyediakan sintaks yang bersih untuk menentukan padanan kes:
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)
Ini menjana fungsi seperti xy_match(char *&_buf, T &user) yang boleh dipanggil dengan mudah.
Kemas Kini C 11: Lambdas dan Initializer Senarai
Dengan C 11, senarai lambdas dan pemula menyediakan penyelesaian yang lebih bersih:
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; });
Pendekatan ini menggunakan carian binari pada senarai diisih padanan kes, memberikan O( log n) kerumitan.
Masa Kompilasi Cuba
Sebagai kemajuan selanjutnya, percubaan masa kompilasi boleh dimanfaatkan untuk mengendalikan cawangan kes yang tidak diisih. Pendekatan ini menggunakan pengaturcaraan meta C 11 lanjutan untuk menjana percubaan carian pada masa penyusunan. Setiap nod trie mengandungi pernyataan suis untuk mengoptimumkan penjanaan kod.
Pelaksanaan boleh didapati di GitHub di smilingthax/cttrie.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Pemalar Bukan Integer dengan Cekap dalam Pernyataan Suis C/C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!