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
Lepaskan: 2024-11-30 14:46:12
asal
1010 orang telah melayarinya

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                    ...
Salin selepas log masuk

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)
Salin selepas log masuk

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; });
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan