2014-12-08 118 views
1

比較我有一個map<string, set<string>>,我有一個條目,這是flights["Madison"].insert("Boston");字符串的映射,設置。值

現在我想知道我怎麼能檢查是否有在地圖上是"Madison", "Boston"的條目。我想不出找到這個集合中的鍵值是否存在的方法。

這是我迄今爲止的嘗試:我感覺好像我是一兩條線。

typedef map<string, set<string>> TFlights; 
    TFlights flights; 
    TFlights::iterator iter, iter2; 
    bool found = false; 


    flights["Madison"].insert("Boston"); 
    flights["Madison"].insert("Miami"); 

    for(iter = flights.begin(); iter != flights.end(); iter++) 
    { 
     if(iter->first == "Madison" && //iter->second contains "Boston") 
     { 
      found = true; 
     } 
    } 

    return found; 

回答

3

使用map::iterator和地圖的find()功能。一旦該值在地圖上找到,set搜索:

bool found = false; 
TFlights::iterator it = flights.find("Madison"); 
if (it != flights.end()) 
{ 
    // key exists in map. Now search the set 
    if (it->second.find("Boston") != it->second.end()) 
    found = true; 
} 
return found; 
+0

所以你行iter-> second.find( 「波士頓」)= ITER替換您的評論 - > second.end()正在通過設置,看看「波士頓」的價值或我正在尋找的東西是否在設置中? – Adam 2014-12-08 06:13:50

+0

是的。這就是你在一組中搜索的方式。使用'find'方法。地圖和集合都有對數搜索時間(即,如果您有1000個項目要搜索,則只需要10次比較)。然而,如果你爲搜索編寫一個for循環(就像你原來的文章所做的那樣),你將擊敗這個優化的目的。 – PaulMcKenzie 2014-12-08 06:14:32

+0

謝謝。我讚賞描述和例子。這是我進入C++ STL的第一步。它工作完美。我採用了你建議的對數方法,並將我的代碼改爲無循環。 [除了find()] – Adam 2014-12-08 06:17:09

0

iter-> second.find("Boston") != iter-> second.end()

-2
map<string, set<string>>::iterator i; 
bool found = (i = flights.find("Madison")) != flights.end()) && i->count("Boston"); 
+0

純代碼的答案,即使沒有細小的單行解釋,也幾乎總是落在VLQ隊列中,並最終被刪除。有近5萬名代表的用戶應該知道這一點。 – trejder 2014-12-08 07:03:37

+0

@trejder:哦,真是一種解脫!......在那一刻,我想我註定要讓所有永恆的讀者脆弱的心靈負擔過重...... ;-) – 2014-12-08 10:09:53