首頁 >後端開發 >C++ >如何在 C 中為我的使用者定義類型專門化「std::hash」?

如何在 C 中為我的使用者定義類型專門化「std::hash」?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-10 03:19:16177瀏覽

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

將std::hash 專門用於無序容器中的使用者定義類型

啟用std::unordered_set 中自訂鍵類型的使用和std::unordered_map 一樣,必須同時提供相等運算子和雜湊函數。這通常涉及定義實作這些運算符的自訂結構或類別。不過,對於使用者定義的類型,使用預設的雜湊函數會更方便,類似於編譯器和函式庫提供的內建類型。

根據 C 標準草稿 N3242 和 Boost.Unordered ,可以將 std::hash 專門化為自訂類型。這涉及到向std 命名空間添加專門化:

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

在此範例中,類型X 的雜湊函數專門用於使用int 類型的雜湊函數,它假設X 有一個成員變數id 。需要注意的是,雜湊函數必須專門針對特定的模板參數類型,並且產生的雜湊值必須與該類型的相等運算子一致。

合法性和可移植性:

  • 向 std 添加專業化是否合法?是的,只要涉及的類型之一是用戶定義的,向 std 添加專門化是合法的。
  • 哪個版本的 std::hash::operator() 符合 C 11?在 C 11 中專門化 std::hash 的正確方法是定義 struct std::hash:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
  • 是否有可移植的方法來做到這一點?上面提供的程式碼應該可以在支援 C 11 的不同編譯器之間移植。

以上是如何在 C 中為我的使用者定義類型專門化「std::hash」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn