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

Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Cekap dalam C untuk Pemalar Bukan Integer?

DDD
DDDasal
2024-12-03 11:07:09974semak imbas

How Can I Efficiently Implement a Switch Statement in C   for Non-Integer Constants?

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!

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