此問題直接與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
我的確認爲它的memcmp類型操作深入了下來。 – Whyrusleeping
爲什麼你不使用'std :: string'作爲關鍵字的任何特定原因? – nneonneo
我的教授寫了上面的'cmp_str'函數,我提出了這個問題,他沒有回答這個問題。我跑了一些測試,並沒有遇到邊緣情況破損,但我仍然對它的工作原理感到沮喪,因爲我認爲它只是插入另一個條目。 – travis