在 stdmap 或 stdmultimap 中搜索

有几种方法可以在 std::mapstd::multimap 中搜索密钥。

  • 要获取第一次出现的键的迭代器,可以使用 find() 函数。如果密钥不存在,则返回 end()

      std::multimap< int , int > mmp{ {1, 2}, {3, 4}, {6, 5}, {8, 9}, {3, 4}, {6, 7} };
      auto it = mmp.find(6);
      if(it!=mmp.end())
          std::cout << it->first << ", " << it->second << std::endl; //prints: 6, 5
      else
          std::cout << "Value does not exist!" << std::endl;
    
      it = mmp.find(66);
      if(it!=mmp.end())
          std::cout << it->first << ", " << it->second << std::endl; 
      else
          std::cout << "Value does not exist!" << std::endl; // This line would be executed.
    
  • 查找 std::mapstd::multimap 中是否存在条目的另一种方法是使用 count() 函数,该函数计算与给定键关联的值的数量。由于 std::map 仅将每个键与一个值相关联,因此其 count() 函数只能返回 0(如果键不存在)或 1(如果存在)。对于 std::multimapcount() 可以返回大于 1 的值,因为可能有多个值与同一个键相关联。

     std::map< int , int > mp{ {1, 2}, {3, 4}, {6, 5}, {8, 9}, {3, 4}, {6, 7} };
     if(mp.count(3) > 0) // 3 exists as a key in map
         std::cout << "The key exists!" << std::endl; // This line would be executed.
     else
         std::cout << "The key does not exist!" << std::endl;
    

    如果你只关心某个元素是否存在,find 肯定更好:它记录你的意图,对于 multimaps,它可以在找到第一个匹配元素后停止。

  • std::multimap 的情况下,可能有几个元素具有相同的键。为了得到这个范围,使用 equal_range() 函数,它返回分别具有迭代器下界(包括)和上界(不包括)的 std::pair。如果密钥不存在,则两个迭代器都将指向 end()

      auto eqr = mmp.equal_range(6);
      auto st = eqr.first, en = eqr.second;
      for(auto it = st; it != en; ++it){
          std::cout << it->first << ", " << it->second << std::endl; 
      }
          // prints: 6, 5
          //         6, 7