2012-10-15 16 views
7

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 
+0

Bunun bir memcmp tipi işleminin derinlerde olduğunu düşünüyorum. – Whyrusleeping

+1

Sadece "std :: string" anahtarını neden kullanmıyorsunuz? – nneonneo

+0

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

cevap

6

sipariş konteynerleri tüm denklik sınıflarını kullanın.

İşaretçilerin haritanızda kalması gerektiğini unutmayın: işaretçiler kapsam dışına çıkarsa garip sonuçlar elde edersiniz. Tabii ki, dizgi değişmezleri programın yaşam süresi boyunca geçerli kalır.

6

Eh, cmp_str özdeş anahtarlarını bulmak için kullanılabilir. cmp_str::operator(x,y) ve cmp_str::operator(y,x) öğelerinin ikisi de false döndürürse, bir yinelenen anahtar buldunuz. Gerçekten fazla bir şey yok. Eğer bir ikili yüklemi !pred(a, b) && !pred(b, a) kullanarak gösterimde ısrar, !(a < b) && !(b < a) ya: ne biri diğerinden daha küçükse a ve b eşdeğer kabul edilmektedir İki değer:

+0

@ Prætorian yup, thx. –

+1

Reddedilme hakkında bir yorum yapıcı olacaktır. –

İlgili konular