Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Nilai Bukan Integer dalam C/C ?

Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Nilai Bukan Integer dalam C/C ?

Susan Sarandon
Lepaskan: 2024-11-30 06:28:11
asal
756 orang telah melayarinya

How Can I Implement Switch Statements with Non-Integer Values in C/C  ?

C/C : Pernyataan Suis untuk Nilai Bukan Integral

Dalam pernyataan suis, selalunya perlu melakukan tindakan berdasarkan bukan- nilai integer. Malangnya, dalam C/C , penyataan suis hanya boleh digunakan dengan ungkapan integer.

Pendekatan Lurus

Penyelesaian mudah untuk mengendalikan penyataan suis bukan bersepadu ialah dengan gunakan satu siri pernyataan if-else:

if (str == "foo") {
  ...
} else if (str == "bar") {
  ...
} else {
  ...
}
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini adalah verbose, tidak cekap (O(n), dengan n ialah bilangan kes) dan tidak mempunyai keanggunan pernyataan suis.

Helah Makro dan Templat

Menggunakan makro dan templat, adalah mungkin untuk melaksanakan carian binari pada masa penyusunan:

#define 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 xy_match yang berfungsi secara automatik carian binari dan menggunakan kod yang sesuai untuk setiap kes. Pendekatan ini cekap (O(log n)), tetapi ia tidak semudah pernyataan suis standard.

C 11 Enhancements

C 11 memperkenalkan lambdas dan senarai pemula, yang sangat meningkatkan kejelasan penyataan suis bukan integer:

template <typename KeyType, typename FunPtrType, typename Comp>
void Switch(const KeyType &amp;value,std::initializer_list<std::pair<const KeyType,FunPtrType>> sws,Comp comp) {
  auto r=std::lower_bound(sws.begin(),sws.end(),val,cmp);
  if ( (r!=sws.end())&amp;&amp;(!cmp(val,*r)) ) {
    r->second();
  }
}
Salin selepas log masuk

Templat ini menyediakan cara ringkas dan cekap untuk melaksanakan penyataan suis bukan integer.

Kompilasi Percubaan Masa

Kemajuan yang lebih terkini melibatkan penggunaan pengaturcaraan meta untuk menjana percubaan carian pada masa penyusunan. Pendekatan ini mengendalikan penyataan suis bukan bersepadu yang tidak diisih dan menjana kod yang cekap menggunakan penjana kod pengkompil:

Switch<const char *,void (*)()>("ger",{ // sorted: 
  {"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 meningkatkan lagi kecekapan dan kebolehbacaan penyataan suis bukan integer dalam C/C .

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pernyataan Suis dengan Nilai Bukan Integer dalam 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