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

Bagaimanakah Saya Boleh Mengendalikan Pemalar Bukan Integer dengan Cekap dalam Pernyataan Suis C/C?

Patricia Arquette
Patricia Arquetteasal
2024-11-30 14:46:121011semak imbas

How Can I Efficiently Handle Non-Integer Constants in a C/C   Switch Statement?

Tukar dengan Pemalar Bukan Integer dalam C/C

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!

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