首頁 >後端開發 >C++ >為什麼 `char*` 鍵在 `std::map` 中失敗,如何修復?

為什麼 `char*` 鍵在 `std::map` 中失敗,如何修復?

Linda Hamilton
Linda Hamilton原創
2024-12-26 04:49:15545瀏覽

Why Do `char*` Keys Fail in `std::map`, and How Can I Fix It?

std::map 中char* 鍵的困惑

在處理像std::map 這樣基於哈希的容器時,理解key類型至關重要。使用char* 作為地圖鍵時會出現一個特殊問題,如下列程式碼所示:

std::map<char*, int> g_PlayerNames;

此程式碼嘗試將玩家名稱(char*) 儲存為鍵,並將對應的整數儲存為值。然而,當使用已知名稱搜尋條目時,比較會失敗,從而導致意外結果。

根本原因在於 char 作為鍵的特殊性質。 std::map 預設使用小於運算子 ( 指針,此比較檢查指針位址而不是它們指向的字串。

要解決此問題,我們需要提供一個對實際字串進行操作的自訂比較函數,而不是指標。引入如下所示的結構體使我們能夠做到這一點:

struct cmp_str
{
    bool operator()(char const *a, char const *b) const
    {
        return std::strcmp(a, b) < 0;
    }
};

透過提供此自訂比較函數,我們指示std::map 根據它們引用的字串來比較char* 鍵,確保正確的鍵查找和插入期間匹配。

因此,我們不使用原始映射定義,而是對其進行修改以包含比較函數:

map<char *, int, cmp_str> g_PlayerNames;

通過此修改,玩家名稱查找和更新邏輯功能按預期運行,利用比較函數根據字串內容來匹配char* 鍵。

以上是為什麼 `char*` 鍵在 `std::map` 中失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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