Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Mendapat Ralat Samar Apabila Menggunakan Jenis Ditakrifkan Pengguna sebagai Kekunci dalam `std::map`, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Saya Mendapat Ralat Samar Apabila Menggunakan Jenis Ditakrifkan Pengguna sebagai Kekunci dalam `std::map`, dan Bagaimana Saya Boleh Membetulkannya?

Linda Hamilton
Lepaskan: 2024-12-22 07:53:10
asal
112 orang telah melayarinya

Why Do I Get Cryptic Errors When Using User-Defined Types as Keys in `std::map`, and How Can I Fix Them?

Cara Menggunakan std::Maps dengan Jenis Ditakrifkan Pengguna sebagai Kunci: Memahami Ralat Samar dan Pendekatan Alternatif

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::map c2int;

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!

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