Menggunakan char* Berkesan sebagai std::map Keys
Dalam C , menggunakan char* sebagai kunci dalam std::map boleh menimbulkan cabaran. Pertimbangkan coretan kod berikut yang cuba mencari nama pemain yang tidak digunakan:
std::map<char*, int> g_PlayerNames; int PlayerManager::CreateFakePlayer() { // ... for(std::map<char*, int>::iterator it = g_PlayerNames.begin(); it != g_PlayerNames.end(); ++it) { // ... } // ... }
Kod ini mungkin tidak berfungsi seperti yang dimaksudkan kerana perbandingan lalai untuk char* dalam std::map membandingkan penunjuk itu sendiri, bukan yang sebenar rentetan yang ditamatkan nol yang mereka tunjuk kepada.
Resolusi
Untuk menangani isu ini, anda mesti menyediakan fungsi perbandingan pada peta. Functor ini harus membandingkan rentetan yang ditunjukkan oleh kekunci char*. Berikut ialah contoh:
struct cmp_str { bool operator()(char const *a, char const *b) const { return std::strcmp(a, b) < 0; } }; map<char *, int, cmp_str> g_PlayerNames;
Dengan menggabungkan fungsi cmp_str, peta kini membandingkan rentetan sebenar, membenarkan logik yang dimaksudkan untuk beroperasi dengan betul.
Ingat, teknik ini digunakan untuk mana-mana senario di mana anda berhasrat untuk menggunakan penunjuk sebagai kunci dalam std::map. Dengan menyediakan functor perbandingan, anda memastikan bahawa peta beroperasi seperti yang dikehendaki, membandingkan nilai sebenar yang diwakili oleh penunjuk.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan `char*` Secara Berkesan sebagai Kekunci dalam C `std::map`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!