【问题标题】:A Map of string, set. Comparing the value字符串映射,设置。比较价值
【发布时间】:2014-12-08 05:57:36
【问题描述】:

我有一个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;

【问题讨论】:

    标签: c++ map set


    【解决方案1】:

    对地图使用map::iteratorfind() 函数。在地图中找到值后,将搜索 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;
    

    【讨论】:

    • 所以你的行 iter->second.find("Boston") != iter->second.end() 正在通过集合来查看 "Boston" 的值或我的值我要找的是在那个集合里吗?
    • 是的。这就是您在集合中搜索的方式。使用find 方法。地图和集合都有对数搜索时间(即如果你有 1000 个项目要搜索,你只需要 10 次比较)。但是,如果您为搜索编写一个 for 循环(就像您的原始帖子所做的那样),您将无法达到此优化的目的。
    • 谢谢。我很欣赏描述和例子。这是我踏入 C++ 的 STL 的第一步。它工作得很好。我采用了您建议的对数方法并将我的代码更改为无循环。 [除了find()]
    【解决方案2】:

    将您的评论替换为 iter-&gt; second.find("Boston") != iter-&gt; second.end()

    【讨论】:

      【解决方案3】:
      map<string, set<string>>::iterator i;
      bool found = (i = flights.find("Madison")) != flights.end()) && i->count("Boston");
      

      【讨论】:

      • 纯代码答案,甚至没有一个微小的单行解释,几乎总是落在 VLQ 队列中并最终被删除。拥有近 50k 代表的用户应该意识到这一点。
      • @trejder: 哦,真是一种解脱!...有那么一刻,我以为我注定要永远对 SO 读者脆弱的心灵施加压力...... ;-)
      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多