Melaksanakan Pernyataan Suis untuk Pemalar Bukan Integer dalam C : Membuka Carian Binari dengan Templat dan Makro
Pernyataan suis klasik dalam C ialah terkenal dengan kecekapannya apabila memilih tindakan berdasarkan nilai integer. Walau bagaimanapun, had penggunaan integer sahaja boleh menimbulkan cabaran apabila berurusan dengan pemalar bukan integer.
Masalahnya: Alternatif Perlahan dan Kompleks
Satu pendekatan ialah menggunakan siri pernyataan if, tetapi ini boleh menjadi tidak cekap dan sukar untuk dikekalkan. Menggunakan struktur data seperti peta untuk memetakan rentetan kepada integer boleh memperkenalkan kerumitan tambahan dan overhed pengekodan.
Carian Binari Pantas dan Isih dengan Makro dan Templat
Untuk mencapai pantas, pelaksanaan yang bersih dan mudah, seseorang boleh menggunakan sihir makro dan templat. Pustaka fastmatch.h menyediakan penyelesaian berasaskan makro yang pada asasnya membuka carian binari pada masa penyusunan. Sintaks adalah serupa dengan pernyataan suis:
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 xy_match yang melakukan carian binari pada kes yang disediakan. Pemecahan adalah tersirat dan sintaksnya diisih.
Kemas kini: C 11 Lambdas and Initializer Lists for Enhanced Elegance
Dengan C 11, senarai lambdas dan initializer menyediakan penyelesaian yang lebih elegan:
#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 }
Pendekatan ini menggunakan lambda berfungsi untuk membandingkan nilai dan algoritma lower_bound untuk mencari kes yang betul.
Kemas kini 2016: Compile-Time Trie for Unsorted Cases
Untuk cawangan kes yang tidak diisih, lebih banyak penyelesaian lanjutan menggunakan penjanaan percubaan masa kompilasi dalam pengaturcaraan meta C 11. Pelaksanaan tersedia dalam perpustakaan cttrie pada GitHub.
Dengan memanfaatkan penjana kod lanjutan pengkompil, pendekatan ini mengoptimumkan proses carian dengan ketara, menawarkan prestasi yang setanding dengan pernyataan suis yang memerlukan integer sebagai input.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap dalam C untuk Pemalar Bukan Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!