2014-12-08 86 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