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
Susan Sarandonasal
2024-11-30 06:28:11841semak imbas

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 {
  ...
}

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)

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();
  }
}

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;}); 

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!

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