2011-07-29 9 views
8

Bu yüzden STL'den yeni standartlaştırılmış unordered_map ile oynuyordum. Ben kodu, ben sadece bir unordered_map oluşturmak doldurmak ve çıktısını tür şu şekildedir:Neden unordered_map siparişi veriyor?

1 mary 
2 had 
3 a 
4 little 
5 lamb 
6 whose 
7 fleece 
8 was 
9 all 
10 fleecey 

Ama:

unordered_map<int,string> m1; 

    m1[5]="lamb"; 
    m1[2]="had"; 
    m1[3]="a"; 
    m1[1]="mary"; 
    m1[4]="little"; 
    m1[7]="fleece"; 
    m1[6]="whose"; 
    m1[10]="fleecey"; 
    m1[8]="was"; 
    m1[9]="all"; 

for(unordered_map<int,string>::const_iterator i = m1.begin(); i != m1.end(); ++i) 
cout<<i->first<<" "<<i->second<<endl; 

Ancak, ben olsun çıkış thusly sıralanır Haritanızı sipariş etmek için fiyatı ödemek istemiyorum! Bu yüzden unordered_map kullanıyorum ... Burada neler oluyor?

ek not: Ben gcc version 4.3.4 20090804 (release) 1 (GCC) kullanıyorum ve benzeri derleme am g++ -std=c++0X maptest.cpp

+0

Benzer şekilde <= 'sizeof (std :: size_t)' boyutlarına sahip integral türleri için karma işlevleri sadece kimlik işlevleridir. – ildjarn

+1

Eğlenmek için, 'm1 [10] = "fleecey"; 'm1 [154297] =" fleecey ";' :) – JohannesD

cevap

8

"Sırasız" rastgele öğeleri saklamak ya da haritada koyun düzeni korumak anlamına gelmez. Bu sadece belirli bir siparişe güvenemeyeceğiniz anlamına gelir. Sipariş için bir fiyat ödemezsiniz, tam tersine - uygulama açıkça ürün siparişi vermez, bir hashmapdır ve öğelerini her ne pahasına olursa olsun saklar, ki bu da genellikle oldukça iyi bir yoldur. Tam olarak bu tuşları ve haritadaki bu işlem sırasını ve sırasını kullanırken haritanın karma algoritması ve diğer dahili işleyişlerinin, sipariş edilen bir siparişte öğeleri saklamakla sonuçlandığı görülür. Dizeler, örneğin, görünüşte rastgele bir düzende yol açabilir.

Bir yan notta, muhtemelen haritanın (en azından bazı) tamsayıların kendisine eşleme yaptığı ve haritanın boyutunu belirleyen alt bitleri (harita boyutu buyruğu kadar) kullanan bir karma kullanarak oluşmasından kaynaklanır. altta yatan dizinin indeksi (örneğin, CPython bunu yapar - bazı çok çarpışmalarla başa çıkabilmeleri için nispeten basit ve verimli bir şekilde zeki eklemeler yaparlar. Aynı sebeple CPython dizgileri ve tuple'larının karmaları çok tahmin edilebilirdir).

+0

Yup gibi bir şeyi değiştirmeye çalışın. Teşekkürler. – Jimmy

2

Eğlence için, std::hash<int> için bir kimlik işlevi de olan libC++ uygulamasının çıktısı.

9 all 
8 was 
10 fleecey 
6 whose 
7 fleece 
4 little 
1 mary 
3 a 
2 had 
5 lamb 

Her biri kendine özgü bir taşıma kabı olan bir hash konteynerini uygulamak için birkaç yol vardır.