Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Fungsi Hash Generik untuk Tuple dalam Koleksi Tidak Tertib?

Bagaimana untuk Melaksanakan Fungsi Hash Generik untuk Tuple dalam Koleksi Tidak Tertib?

DDD
Lepaskan: 2024-11-15 09:21:02
asal
502 orang telah melayarinya

How to Implement a Generic Hash Function for Tuples in Unordered Collections?

Fungsi Hash Generik untuk Tuple dalam Koleksi Tidak Tertib

Bekas std::unordered_map dan std::unordered_set menyediakan carian dan pemasukan elemen yang cekap berdasarkan nilai cincang mereka. Walau bagaimanapun, menggunakan tupel sebagai kunci dalam koleksi ini tanpa mentakrifkan fungsi cincang tersuai boleh membawa kepada gelagat yang tidak dijangka.

Untuk membetulkannya, satu pendekatan ialah mentakrifkan fungsi cincang secara manual untuk jenis tuple tertentu, seperti:

template<>
struct std::hash<std::tuple<int, int>> {
  size_t operator()(std::tuple<int, int> const& tuple) const { ... }
};
Salin selepas log masuk

Sementara pendekatan ini berfungsi, ia boleh membosankan untuk menentukan fungsi cincang untuk setiap jenis tupel yang digunakan. Untuk mengautomasikannya, fungsi cincang generik boleh dilaksanakan seperti berikut:

#include <tuple>

namespace std {
  namespace {

    // Code derived from Boost
    template<class T>
    inline void hash_combine(std::size_t& seed, T const& v) { ... }

    // Recursive template code from Matthieu M.
    template<class Tuple, size_t Index = std::tuple_size<Tuple>::value - 1>
    struct HashValueImpl { ... };

  }

  template<typename... TT>
  struct hash<std::tuple<TT...>> {
    size_t operator()(std::tuple<TT...> const& tuple) const { ... }
  };
}
Salin selepas log masuk

Fungsi ini memanfaatkan carian nama bergantung pada argumen (ADL) untuk membolehkan pengkompil memilih pelaksanaan cincang yang betul berdasarkan jenis tuple secara automatik .

Penyelesaian Conformant Standard

Perlu diambil perhatian bahawa mentakrifkan fungsi bukan standard dalam ruang nama std ialah tingkah laku yang tidak ditentukan. Untuk penyelesaian yang mematuhi piawaian, ruang nama tersuai boleh dibuat dan digunakan untuk mentakrifkan fungsi cincang:

namespace my_hash {

  // Forward non-tuple types to the std::hash
  template<typename TT>
  struct hash { ... };

  // Provide the optimized hash for tuples
  template<typename... TT>
  struct hash<std::tuple<TT...>> { ... };

}
Salin selepas log masuk

Apabila menggunakan penyelesaian ini, koleksi yang tidak tertib mesti merujuk pelaksanaan cincang tersuai secara eksplisit seperti berikut:

unordered_set<
  std::tuple<double, int>,
  std::hash<std::tuple<double, int>>,
  std::equal_to<std::tuple<double, int>>
> test;  
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Fungsi Hash Generik untuk Tuple dalam Koleksi Tidak Tertib?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan