首頁 >後端開發 >C++ >為什麼在使用使用者定義類型作為「std::map」中的鍵時會出現隱密錯誤,以及如何修復這些錯誤?

為什麼在使用使用者定義類型作為「std::map」中的鍵時會出現隱密錯誤,以及如何修復這些錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-22 07:53:10152瀏覽

Why Do I Get Cryptic Errors When Using User-Defined Types as Keys in `std::map`, and How Can I Fix Them?

如何使用以使用者定義型別為鍵的std::Map:了解隱性錯誤與替代方法

簡介

當嘗試使用以使用者定義的類別作為鍵的STL 映射時,程式設計師可能會遇到神秘的問題錯誤訊息,阻礙他們的進步。本文深入探討了此錯誤背後的原因,並探討了有效使用 std::maps 的替代方法。

神秘錯誤和原因

如提供的範例所示,使用使用者定義類型作為映射鍵會引發錯誤,因為編譯器無法為特定類型找到合適的比較運算符。在這種情況下,std::map 依賴運算子

替代方法

1.比較器函數物件:

避免該錯誤的一種方法是定義一個比較器函數對象,該對象實現運算子

例如,以下程式碼片段使用比較器函數物件來比較和排序 Class1 實例:

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

std::map<Class1, int, Class1Compare> c2int;

2。 std::less 的特化:

另一種方法涉及專門化 std::less 模板來專門為使用者定義類型提供比較語義。這確保了與 std::map 的預設比較行為的無縫集成,而無需暴露顯式的運算符

namespace std
{
    template<> struct less<Class1>
    {
       bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const
       {
           return lhs.id < rhs.id;
       }
    };
}

透過採用這些替代方案中的任何一個,程式設計師可以有效地將std::map 與使用者定義的類型鍵一起使用,從而消除對顯式運算子

以上是為什麼在使用使用者定義類型作為「std::map」中的鍵時會出現隱密錯誤,以及如何修復這些錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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