2012-10-15 54 views
7

此問題直接與using char as a key in stdmap有關。使用char *作爲std :: map中的鍵,它是如何工作的

我明白比較功能是通過了什麼,爲什麼它需要char *類型作爲關鍵。但是,我不確定更新是如何實際工作的。

我很好奇你正在更新密鑰的情況。 std::map如何知道如何比較const char *,cmp_str之間的等式之間的關係,只告訴映射將鍵值插入樹中的順序。

我已經做了一點挖掘stl_tree.h代碼(pulled from here),但無法找到太多。我唯一的猜測是它做了一個直接的記憶比較。

我對下級stl_tree類如何處理這種情況感興趣,或者如果它不能始終正確處理它,哪種情況會破壞?

代碼

#include <map> 
#include <iostream> 
#include <cstring> 

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

int main (int argc, char ** argv) 
{ 

    std::map<const char*, int, cmp_str> map; 

    map["aa"] = 1; 
    map["ca"] = 2; 
    map["ea"] = 3; 
    map["ba"] = 4; 

    map["ba"] = 5; 
    map["bb"] = 6; 

    map["ba"] = 7; 

    std::map<const char*, int, cmp_str>::iterator it = map.begin(); 
    for (; it != map.end(); it++) 
    { 
     std::cout << (*it).first << ": " << (*it).second << std::endl; 
    } 

    return 0; 

} 

輸出

aa: 1 
ba: 7 
bb: 6 
ca: 2 
ea: 3 
+0

我的確認爲它的memcmp類型操作深入了下來。 – Whyrusleeping

+1

爲什麼你不使用'std :: string'作爲關鍵字的任何特定原因? – nneonneo

+0

我的教授寫了上面的'cmp_str'函數,我提出了這個問題,他沒有回答這個問題。我跑了一些測試,並沒有遇到邊緣情況破損,但我仍然對它的工作原理感到沮喪,因爲我認爲它只是插入另一個條目。 – travis

回答

6

有序容器都使用等價類:兩個值ab被認爲是等價的,如果沒有一個比另一個更小:!(a < b) && !(b < a)或者,如果你堅持使用二進制謂詞!pred(a, b) && !pred(b, a)的符號。

請注意,您需要將指針保留在地圖中:如果指針超出範圍,您將得到奇怪的結果。當然,字符串文字在程序的整個生命週期中保持有效。

6

好,cmp_str可以用來找到相同的密鑰。如果cmp_str::operator(x,y)cmp_str::operator(y,x)都返回false,那麼您已找到重複的密鑰。真的沒什麼更多。

+0

@Prætorianyup,thx。 –

+1

對downvote的評論將是建設性的。 –

相關問題