2017-04-16 21 views
1

進行遍歷時,當我通過貼在它下面的代碼讀取看來,打印輸出將是:獲取反向輸出通過地圖和打印內容

Syndy 
    James 
    Phuong 
Germaine 
    Agatha 
    Anges 
    Jack 

然而,當我運行它,我得到傑曼和他的矢量朋友第一次印刷,然後Syndy和她的朋友載體第二:

Germaine 
    Agatha 
    Anges 
    Jack 
Syndy 
    James 
    Phuong 

誰能幫我明白爲什麼傑曼,第二個鍵,訪問,並在printFacebook函數,而不是Syndy第一印刷?

#include <iostream> 
#include <vector> 
#include <string> 
#include <map> 
using namespace std; 

void printFacebook(map<string, vector<string>>& m) { 

    for (pair<string, vector<string>> p : m) { 
     cout << p.first << endl; 
     for (string f : p.second) { 
      cout << "\t" << f << endl; 
     } 
    } 
} 

int main() { 

    map<string, vector<string>> facebook; 

    facebook["Syndy"].push_back("James"); 

    facebook.find("Syndy")->second.push_back("Phuong"); 
    //map<string, vector<string>>::iterator f = facebook.find("Syndy"); 
    //auto f = facebook.find("Syndy"); 

    facebook["Germaine"]; 
    facebook.find("Germaine")->second.push_back("Agatha"); 
    facebook.find("Germaine")->second.push_back("Anges"); 
    facebook.find("Germaine")->second.push_back("Jack"); 

    printFacebook(facebook); 
} 

回答

1

A std::map存儲按鍵的值排序的項目。在你的情況下,密鑰是"Syndy""Germaine"。這些默認排序是"Germaine"是第一個,"Syndy"是第二個。

因此,當您迭代地圖的項目時,在對應於鍵"Syndy"的項目之前看到對應於鍵"Germaine"的項目。

這解釋了輸出。

+0

所以std :: map自己排序?它如何確定密鑰的順序? – StacksAndParsing

+0

@StacksAndParsing,是的。 'std :: map'有一個用於比較鍵的可選參數。默認是'std :: less '。有關更多詳細信息,請參見http://en.cppreference.com/w/cpp/container/map。 –