Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengkhususkan `std::hash` untuk Jenis Ditentukan Pengguna Saya dalam C ?

Bagaimanakah Saya Boleh Mengkhususkan `std::hash` untuk Jenis Ditentukan Pengguna Saya dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-12-10 03:19:16
asal
138 orang telah melayarinya

How Can I Specialize `std::hash` for My User-Defined Types in C  ?

Mengkhususkan std::hash untuk Jenis Ditentukan Pengguna dalam Bekas Tidak Teratur

Untuk mendayakan penggunaan jenis kunci tersuai dalam std::unordered_set dan std::unordered_map, seseorang mesti menyediakan kedua-dua pengendali kesamaan dan fungsi cincang. Ini biasanya melibatkan penentuan struct atau kelas tersuai yang melaksanakan pengendali ini. Walau bagaimanapun, adalah lebih mudah untuk menggunakan fungsi cincang lalai untuk jenis yang ditentukan pengguna, serupa dengan jenis terbina dalam yang disediakan oleh pengkompil dan pustaka.

Menurut Draf Standard C N3242 dan Boost.Unordered , adalah mungkin untuk mengkhususkan std::hash untuk jenis tersuai. Ini melibatkan penambahan pengkhususan pada ruang nama std:

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const { return hash<int>()(x.id); }
}
Salin selepas log masuk

Dalam contoh ini, fungsi cincang untuk jenis X dikhususkan untuk menggunakan fungsi cincang untuk jenis int, yang menganggap bahawa X mempunyai id pembolehubah ahli. Adalah penting untuk ambil perhatian bahawa fungsi cincang mesti dikhususkan untuk jenis hujah templat tertentu dan nilai cincang yang terhasil mestilah konsisten dengan pengendali kesamaan untuk jenis tersebut.

Legaliti dan Mudah Alih:

  • Adakah sah untuk menambah pengkhususan kepada std? Ya, adalah sah untuk menambah pengkhususan kepada std selagi salah satu jenis yang terlibat ditentukan oleh pengguna.
  • Versi std::hash::operator() yang manakah mematuhi C 11? Cara yang betul untuk mengkhususkan std::hash dalam C 11 ialah dengan mentakrifkan pengkhususan struct std::hash:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
Salin selepas log masuk
  • Adakah terdapat cara mudah alih untuk melakukannya? Kod yang disediakan di atas hendaklah mudah alih merentas penyusun berbeza yang menyokong C 11.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengkhususkan `std::hash` untuk Jenis Ditentukan Pengguna Saya dalam 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