2011-12-13 12 views
11

Bir std :: map myMap sahip olan harita: Şimdi istediğimstd sıralama :: ı gibi harita değerleri eklerseniz anahtar,</p> <p>Şimdi bir std :: string

std::map <string, string> mymap; 
mymap["first"] = "hi"; 
mymap["third"] = "how r you"; 
mymap["second"] = "hello"; 

harita üzerinde yineleme ve sıralanır (tuşları) tarzda değerini yazdırmak için:

map<string, string>::iterator itr; 
for(itr = mymap.begin(); itr != mymap.end(); itr++) 
{ 
    string newline = itr->second; 
    cout << newline << endl; 
} 

Çıktı olmalıdır:

hi 
hello 
how r you 

Ben girişteki veriyorum olarak değil sıralı tuşlar şekilde varsayılan harita mağazalarında tarafından ben çıktıda aynı sırayı alıyorum düşündük. Bunun için sıralama işlevimi sağlamalı mıyım yoksa harita üzerinde yinelemeden önce fazladan bir şeyler yapmalı mıyım? Eğer o tür isterseniz kendin yap zorunda

+3

Döngü için "file_line" değil "mymap" ifadesi kullanılır. Anladığım kadarıyla bu "ilk", "mymap" popülasyonunda alıntılanmamış gerçek kod değildir. – hmjd

+0

C++ std :: map uygulamasından tam olarak emin değilim, ancak bu tür hashtables'ler genellikle sıralanmaz. Bunlar dizinleyiciyle erişilmek isteniyor, geçiş yapılmıyor. – Gigi

+2

@ user983064 std :: map anahtar tarafından sipariş edilen bir ikili ağaçtır. C++ 11, std :: unordered_map gibi karma tablolara sahiptir. – juanchopanza

cevap

16

elemanları anahtarına uygulanan operator< göre (varsayılan) sıralanır.

std::map <string, string> mymap; 
mymap["first"]="hi"; 
mymap["third"]="how r you"; 
mymap["second"]="hello"; 

for (std::map<string, string>::iterator i = mymap.begin(); i != mymap.end(); i++) 
{ 
    cout << i->second << "\n"; 
} 

Baskı:

hi 
hello 
how r you 
+0

uhmmmm ... peki ya "dördüncü"? "İlk" mi yoksa "üçüncü" mi olmalı? Karşılaştırma tahmini özelleştirme ihtiyacı olabilir ... –

+0

@EmilioGaravaglia, evet anahtar olarak bir "int" kullanır ya da kullanır. – hmjd

+2

'auto'? Bu soru [tag: C++ 11] – juliomalegria

0

standardında tanımlanan map girişlerin sırası, (Bence). Örneğin, sort işleviyle. Ancak, map ile çalışacağından emin değilim. Eğer sıralanmış emin olmak istiyorsan, sana bir vector veya list kopyalamak ve bu sıralamak ve çıkış göstermektedir.

4

map aslında tree ve ANAHTAR düzenine göre sıralanır. ANUE değil, itr->second yazıyorsunuz. Anahtar/değer çiftlerinizi VALUE olarak sıralamak istiyorsanız, bunun yerine VALUE (anahtar olarak) kullanın veya her şeyi başka bir kapsayıcıda (bir dizi) saklayın, ardından bunları sıralayın. std::map içinde

+1

Dedikleriniz doğru, yani KEYS: "ilk" <"ikinci" <"üçüncü", bu yüzden OP'nin dediği gibi aynı sonucu beklemeliyiz: 'hi | merhaba | sen nasılsın, ama dedi ki: _ Ben girişte verdiğim gibi aynı düzende alıyorum, yani: hi | nasılsın hello'. – juliomalegria

3

std :: map zaten sıralanır Eğer beklendiği gibi

Eğer küçük değişikliklerde ile yayınlanmıştır kod

, benim için çalıştı. Unordered_map kullanıyordunuz, şimdi bir sorun yaşayacaksınız! std

Girişler :: haritası ilk> anahtarı tarafından sipariş edilen veya itr- edilir. itr-> ikincisi olduğu gibi, anahtarla ilişkili değere başvurur.

Daha da fazlası, harita üzerinde yineleme yapmıyorsunuz, file_line üzerinde yineleniyorsunuz (bunun ne olduğunu bilmiyorum, ama bunun mymap'ten farklı olduğunu varsayıyorum. üzerinde yineleme).

1

standart tanımlar:

birleştirici kapların Yineleyicilerin temel tesis dışı inen kullanılan karşılaştırma ile tanımlanır şifreler olmayan azalan sırada konteyner yinelemenize olmasıdır , bunları oluşturur.

İlgili konular