2011-12-13 56 views
11

我有一個std ::地圖MyMap中現在排序中的std ::地圖,關鍵是爲std :: string

,如果我在地圖上像插入值:

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

現在我想遍歷在地圖上並在分選(鍵)的方式打印該值:

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

輸出應爲:

hi 
hello 
how r you 

我認爲默認情況下映射存儲在排序的鍵的方式,但我得到的輸出相同的順序,因爲我在輸入。我是否需要爲此提供排序功能,還是需要在迭代地圖之前做一些額外的工作?

+3

for循環引用'file_line'而不是'mymap'。我認爲這不是實際的代碼,因爲'mymap'的人口中沒有引用'first'。 – hmjd

+0

我不太清楚C++ std :: map的實現,但是這些哈希表通常不會被排序。它們旨在通過索引器訪問,而不是遍歷。 – Gigi

+2

@ user983064 std :: map是一個二叉樹,按鍵排序。 C++ 11有散列表,如std :: unordered_map。 – juanchopanza

回答

16

std::map中的元素被排序(默認情況下)operator<應用於密鑰。

你貼出來,與小修改的代碼,爲我工作,你希望:

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"; 
} 

打印:

hi 
hello 
how r you 
+0

uhmmmm ...「第四」呢?應該在「第一」還是「第三」之後? 可能是他需要自定義比較謂詞... –

+0

@EmilioGaravaglia,是的,他會或只是使用'int'作爲關鍵。 – hmjd

+2

'auto'?這個問題沒有被標記爲[tag:C++ 11] – juliomalegria

0

標準中定義的map中的條目順序(我認爲),所以如果你想要它排序,你必須做到這一點。例如用sort函數。但是,我不確定它是否可以與map一起使用。如果你想確定它已被排序,我建議你將它複製到vectorlist並對其進行排序和輸出。

4

map實際上是一個tree,並按鍵順序排序。您正在打印itr->second,這是VALUE而非KEY。如果您希望按VALUE排序鍵/值對,請使用VALUE作爲鍵,或將所有內容存儲在另一個容器(比如數組)中,然後對它們進行排序。

+1

你說的是正確的,所以KEYS是:''第一個「<」秒「<」第三「',因此,我們應該期待與OP所說的相同的結果:'hi |你好|你怎麼樣,但他說: - 我在input_中得到的輸出順序相同,即:'hi |你如何| hello'。 – juliomalegria

3

的std ::地圖已經被訂購。如果你使用的是unordered_map,現在你會遇到問題!

std :: map中的條目按鍵排序,或者itr-> first。 itr-> second,因爲它指的是與鍵關聯的值。另外,你沒有遍歷地圖,你正在遍歷file_line(我不知道那是什麼,但我會認爲它與mymap不同,這就是你應該做的迭代)。

1

該標準定義:

關聯容器的迭代器的基本性質是它們通過在鍵的非遞減的次序,其中非下降是由使用該比較中定義的容器 迭代到 構建它們。

相關問題