Kerisauan char* Kekunci dalam std::map
Apabila berurusan dengan bekas berasaskan cincang seperti std::map, memahami kunci jenis adalah penting. Isu pelik timbul apabila menggunakan char* sebagai kunci peta, seperti yang digambarkan dalam kod berikut:
std::map<char*, int> g_PlayerNames;
Kod ini cuba menyimpan nama Pemain (char*) sebagai kunci dan integer yang sepadan sebagai nilai. Walau bagaimanapun, apabila mencari entri menggunakan nama yang diketahui, perbandingannya gagal, membawa kepada hasil yang tidak dijangka.
Punca utama terletak pada sifat pelik char sebagai kunci. std::map membandingkan kunci secara lalai menggunakan operator kurang daripada (<). Walau bagaimanapun, untuk penunjuk char, perbandingan ini menyemak alamat penuding dan bukannya rentetan yang ditunjukkan.
Untuk menyelesaikan isu ini, kami perlu menyediakan fungsi perbandingan tersuai yang beroperasi pada rentetan sebenar, bukan petunjuk. Memperkenalkan struct seperti berikut membolehkan kami melakukan ini:
struct cmp_str { bool operator()(char const *a, char const *b) const { return std::strcmp(a, b) < 0; } };
Dengan menyediakan fungsi perbandingan tersuai ini, kami mengarahkan std::map untuk membandingkan kekunci char* berdasarkan rentetan yang dirujuk, memastikan kekunci yang betul padanan semasa carian dan sisipan.
Jadi, daripada menggunakan takrifan peta asal, kami mengubah suainya untuk memasukkan perbandingan fungsi:
mapg_PlayerNames; Dengan pengubahsuaian ini, carian nama pemain dan fungsi logik kemas kini seperti yang dimaksudkan, menggunakan fungsi perbandingan untuk memadankan kekunci char* berdasarkan kandungan rentetannya.
Atas ialah kandungan terperinci Mengapa Kekunci `char*` Gagal dalam `std::map` dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!