2010-07-10 34 views
3

將值插入到地圖中時出現一些奇怪的行爲:我總是插入到地圖的末尾,但有時候這些條目出現亂序。令人困惑的std :: map插入行爲

如果我做一個簡單的測試,然後我沒有得到任何problems-號碼是否正確下令:

map<int,int> testMap; 
for(int i = 0; i < 100; ++i) 
{ 
    // everything is ordered correctly here 
    testMap.insert(testMap.end(), pair<int,int>(i,i)); 
} 

但是,當我解析字符串,我嘗試插入相同的順序值,因爲我讀他們,然後事情不鍛鍊身體那麼好:

const string INPUT_TWO = 
"=VAR STRING1 \"MYSTRING\"\n\ 
=VAR STRING2 \"EXAMPLE\"\n\ 
=VAR NUMBER1 12345\n\ 
=VAR NUMBER2 23456\n\ 
=VAR DUMMY 1111\n"; 

const string VAL_STRING = "VAR"; 

vector<pair<string, string>> parse_fields(const string & input) 
{ 
    map<string, string> fieldsMap; 
    vector<pair<string, string>> sequenceFields; 
    vector<string> lines = split(input, '\n'); 
    for(size_t i = 0; i < lines.size(); ++i) 
    { 
     if(lines[i].find(VAL_STRING)!=string::npos) 
     { 
      vector<string> vals = split(lines[i], ' '); 
      if(vals.size()==3) 
      { 
       fieldsMap.insert(fieldsMap.end(), pair<string,string>(vals[1], remove_quotes(vals[2]))); 
       sequenceFields.push_back(pair<string,string>(vals[1], remove_quotes(vals[2]))); 
      } 
     } 
    } 

    // at the end the map looks like: 
    // "DUMMY", "1111" 
    // "NUMBER1", "12345" 
    // "NUMBER2", "23456" 
    // "STRING1", "MYSTRING" 
    // "STRING2", "EXAMPLE" 

    // the vector of pairs looks like: 
    // "STRING1", "MYSTRING" 
    // "STRING2", "EXAMPLE" 
    // "NUMBER1", "12345" 
    // "NUMBER2", "23456" 
    // "DUMMY", "1111" 

    return sequenceFields; 
} 

供您參考,我已經粘貼的所有額外的代碼在pastie

有人知道爲什麼會發生這種情況嗎?

回答

4

A std::map是一個有序的容器,這是它允許它查找的時間。如果您需要映射和列表,請考慮使用Boost.MultiIndex

+1

GMan,我剛剛想到了這一點,我正準備將int map從100反轉爲0而不是0到100 ...所以現在這一切都合情合理。 – Kiril 2010-07-10 07:01:57

1

地圖不是固有的命令。從概念上講,它們代表鍵值對。但是C++ std::map映射是內部排序的。見http://www.cplusplus.com/reference/stl/map/。所以條目將有效地按鍵值排序。

如果你需要你自己的排序,你應該使用元組列表。或者如果你有一個unordered_map(請參閱http://en.wikipedia.org/wiki/Unordered_map_%28C%2B%2B%29; hash_map可能在您的平臺上可用)。或者在檢索結果時對結果進行排序。