Bu soru doğrudan using char as a key in stdmap ile ilgilidir.char * bir anahtar olarak std :: map'de nasıl kullanılır
Karşılaştırma işlevinin ne yaptığını ve neden bir anahtar olarak char *
türünün gerekli olduğunu anlıyorum. Ancak, güncelleştirmenin aslında nasıl çalıştığından emin değilim.
Bir anahtarı güncelleştirdiğiniz durum hakkında merak ediyorum. std::map
, const char *
, cmp_str
arasındaki eşitliğin nasıl karşılaştırılacağını bilir, yalnızca anahtarları ağacın içine yerleştirme sırasını gösterir.
stl_tree.h
kodunu (pulled from here) arayarak çok fazla araştırma yaptım ancak bulamadık. Tek tahminim, onun düz bir hafıza karşılaştırması yapması.
stl_tree
sınıfının alt kısmının bu durumu nasıl ele aldığını veya her zaman doğru şekilde işlemezse hangi kenarda kırıldığını merak ediyorum.
Kod
#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;
}
Çıktı
aa: 1
ba: 7
bb: 6
ca: 2
ea: 3
Bunun bir memcmp tipi işleminin derinlerde olduğunu düşünüyorum. – Whyrusleeping
Sadece "std :: string" anahtarını neden kullanmıyorsunuz? – nneonneo
Profesörüm yukarıdaki cmp_str işlevini yazdı ve soruyu sordum, soruya bir cevabı yoktu. Birkaç test yaptım ve uçurumun karşısına geçemedim, ama yine de masaya başka bir giriş ekleyeceğimi düşündüğümden, hala nasıl çalıştığını anladım. – travis