Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Jenis Ditakrifkan Pengguna sebagai Kekunci dalam std::maps dalam C ?

Bagaimanakah Saya Boleh Menggunakan Jenis Ditakrifkan Pengguna sebagai Kekunci dalam std::maps dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-22 18:14:14778semak imbas

How Can I Use User-Defined Types as Keys in std::maps in C  ?

Mengatasi Halangan: Menggunakan std::maps dengan Jenis Ditentukan Pengguna sebagai Kekunci

Dalam bidang pemetaan pasangan nilai kunci dalam C , bukan sesuatu yang luar biasa untuk menghadapi situasi di mana jenis yang ditentukan pengguna lebih disukai untuk menentukan kunci. Walau bagaimanapun, apabila cuba menggunakan std::maps dengan kunci yang ditentukan pengguna, mesej ralat samar mungkin muncul semasa penyusunan. Untuk memahami ralat ini dan kepentingannya, mari kita mendalami nuansa std::maps dan jenis yang ditentukan pengguna.

Apabila bekerja dengan std::maps, kita sering bergantung pada jenis primitif sebagai kunci, seperti integer atau rentetan. Jenis primitif mempunyai pengendali perbandingan yang jelas (<, >, ==, dsb.) yang memudahkan susunan kunci yang cekap dalam peta. Walau bagaimanapun, apabila menggunakan jenis yang ditentukan pengguna sebagai kunci, adalah penting untuk ambil perhatian bahawa pelaksanaan pengendali perbandingan ini adalah penting untuk fungsi peta yang betul. Di sinilah mesej ralat yang anda temui dimainkan.

Ralat yang disebut dalam soalan membayangkan ketiadaan pengendali< pelaksanaan untuk Kelas1 yang ditentukan pengguna. Secara lalai, std::maps bergantung pada kurang<> templat untuk membandingkan kunci. kurang<> secara dalaman memanggil operator< ditakrifkan untuk jenis kunci. Malangnya, Class1 kekurangan operator ini, mengakibatkan ralat penyusunan.

Untuk menyelesaikan isu ini, terdapat beberapa penyelesaian yang berdaya maju:

  1. Operator pelaksana<: Tentukan seorang pengendali< fungsi ahli dalam Kelas1 yang menetapkan kriteria perbandingan untuk susunan kunci. Walau bagaimanapun, adalah wajar dipertimbangkan sama ada menyediakan operator< untuk kelas anda masuk akal dari sudut logik.
  2. Menggunakan Objek Fungsi Pembanding: Daripada melaksanakan operator<, cipta objek fungsi pembanding berasingan yang merangkumi logik perbandingan. Ini membolehkan fleksibiliti dan modulariti kod yang lebih besar. Contoh pendekatan sedemikian ditunjukkan dalam coretan kod berikut:
struct Class1Compare {
    bool operator() (const Class1& lhs, const Class1& rhs) const {
        return lhs.id < rhs.id;
    }
};

std::map<Class1, int, Class1Compare> c2int;</p>
<ol start="3"><li>
<strong>Mengkhususkan std::less:</strong> Jika semantik perbandingan tidak penting untuk kegunaan anda kes, pertimbangkan untuk mengkhususkan templat std::less untuk Class1. Pendekatan ini membenarkan kriteria perbandingan ditakrifkan di luar skop Kelas1, menjadikan kod lebih boleh diperluaskan.</li></ol>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
        bool operator() (const Class1& lhs, const Class1& rhs) const {
            return lhs.id < rhs.id;
        }
    };
}

Dengan menggunakan salah satu pendekatan ini, anda boleh mengatasi ralat dan berjaya menggunakan std: :peta dengan jenis yang ditentukan pengguna sebagai kunci. Adalah penting untuk memilih penyelesaian yang paling sesuai dengan keperluan projek anda dan prinsip reka bentuk.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Jenis Ditakrifkan Pengguna sebagai Kekunci dalam std::maps dalam 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