Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menggunakan Jenis Ditakrifkan Pengguna Tersuai sebagai Kekunci dalam Peta C?

Bagaimanakah Saya Boleh Menggunakan Jenis Ditakrifkan Pengguna Tersuai sebagai Kekunci dalam Peta C?

Mary-Kate Olsen
Lepaskan: 2024-12-29 05:16:15
asal
665 orang telah melayarinya

How Can I Use Custom User-Defined Types as Keys in C   Maps?

Jenis Ditakrifkan Pengguna Tersuai sebagai Kekunci Peta dalam C

Peta dalam Perpustakaan Standard C menyediakan operasi carian dan sisipan yang cekap untuk nilai kunci berpasangan. Walau bagaimanapun, apabila cuba menggunakan kelas yang ditentukan pengguna sebagai kunci peta, pembangun mungkin menghadapi mesej ralat samar kerana ketiadaan fungsi perbandingan yang sesuai.

Satu mesej ralat biasa ialah: "tiada padanan untuk 'operator<' dalam '__x < __y'". Ralat ini timbul kerana peta memerlukan pembanding atau pengendali perbandingan (seperti operator<) untuk menentukan susunan kekunci.

Secara lalai, peta menggunakan parameter templat pembanding std::less untuk menentukan susunan kekunci . Jika jenis kunci menyediakan operator< terlebih beban, std::less akan mewakilkan perbandingan kepadanya. Walau bagaimanapun, untuk jenis yang ditakrifkan pengguna, ia tidak selalu sesuai untuk membebankan operator<.

Untuk menyelesaikan isu ini, terdapat beberapa pendekatan:

  1. Pembanding Objek Fungsi: Buat kelas berasingan yang melaksanakan perbandingan khusus untuk jenis yang ditentukan pengguna anda. Dalam kod yang disediakan, kelas Class1Compare ditakrifkan dengan fungsi operator() yang membandingkan kejadian Class1 berdasarkan ahli id ​​mereka.

    struct Class1Compare
    {
       bool operator() (const Class1& lhs, const Class1& rhs) const
       {
          return lhs.id < rhs.id;
       }
    };
    Salin selepas log masuk

    Kemudian, apabila membuat instantiate peta, nyatakan objek fungsi pembanding sebagai yang ketiga parameter templat:

    std::map<Class1, int, Class1Compare> c2int;</p>
    <li>
    <p><strong>Pengkhususan Templat std::less</strong>: Pilihan lain ialah mengkhususkan templat std::less untuk jenis yang ditentukan pengguna anda. Ini membolehkan anda mentakrifkan logik perbandingan terus dalam ruang nama std.</p>
    <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;
          }
       };
    }
    Salin selepas log masuk

    Dengan mengkhususkan std::less, anda boleh mengelak daripada mendedahkan operator eksplisit< membebankan ke bahagian lain kod anda, menjadikan logik perbandingan anda lebih terkapsul.

  2. Dengan menggunakan salah satu pendekatan ini, anda boleh mengatasi batasan menggunakan jenis yang ditentukan pengguna sebagai kunci peta dan keuntungan faedah kemudahan pemetaan Perpustakaan Standard C yang cekap.

    Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Jenis Ditakrifkan Pengguna Tersuai sebagai Kekunci dalam Peta C?. 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