Pengenalan
Apabila cuba menggunakan peta STL dengan kelas yang ditentukan pengguna sebagai kunci, pengaturcara mungkin menghadapi mesej ralat samar, menghalang kemajuan mereka. Artikel ini menyelidiki sebab di sebalik ralat ini dan meneroka pendekatan alternatif untuk menggunakan std::maps dengan berkesan.
Ralat dan Sebab Samar
Seperti yang digambarkan dalam contoh yang disediakan , menggunakan jenis yang ditentukan pengguna sebagai kunci peta menimbulkan ralat yang berpunca daripada ketidakupayaan pengkompil untuk mencari pengendali perbandingan yang sesuai untuk jenis tertentu. Dalam contoh ini, std::map bergantung pada ketersediaan operator< berfungsi untuk menentukan susunan unsur.
Pendekatan Alternatif
1. Objek Fungsi Pembanding:
Satu kaedah untuk memintas ralat ialah dengan mentakrifkan objek fungsi pembanding, yang melaksanakan operator< kefungsian. Pendekatan ini membolehkan anda mewujudkan logik perbandingan tanpa mendedahkannya melalui beban operator yang berlebihan pada kelas yang ditentukan pengguna.
Sebagai contoh, coretan kod berikut menggunakan objek fungsi pembanding untuk membandingkan dan menyusun kejadian Kelas1:
struct Class1Compare { bool operator() (const Class1& lhs, const Class1& rhs) const { return lhs.id < rhs.id; } }; std::mapc2int; 2. Pengkhususan std::less:
Pendekatan alternatif melibatkan pengkhususan templat std::less untuk menyediakan semantik perbandingan khusus untuk jenis yang ditentukan pengguna. Ini memastikan penyepaduan yang lancar dengan kelakuan perbandingan lalai std::map tanpa mendedahkan operator yang jelas< beban berlebihan:
namespace std { template<> struct less{ bool operator() (const Class1& lhs, const Class1& rhs) const { return lhs.id < rhs.id; } }; } Dengan mengguna pakai salah satu daripada alternatif ini, pengaturcara boleh menggunakan std::maps secara berkesan dengan kekunci jenis yang ditentukan pengguna, menghapuskan keperluan untuk operator eksplisit< lebihan beban sambil mengekalkan fleksibiliti dan kecekapan yang ditawarkan oleh peta STL.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat Samar Apabila Menggunakan Jenis Ditakrifkan Pengguna sebagai Kekunci dalam `std::map`, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!