C++ Buscando en std :: map o en std :: multimap


Ejemplo

Hay varias formas de buscar una clave en std::map o en std::multimap .

  • Para obtener el iterador de la primera aparición de una clave, se puede usar la función find() . Devuelve end() si la clave no existe.

      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.
    
  • Otra forma de averiguar si existe una entrada en std::map o en std::multimap es usar la función count() , que cuenta cuántos valores están asociados con una clave determinada. Como std::map asocia solo un valor con cada tecla, su función count() solo puede devolver 0 (si la tecla no está presente) o 1 (si lo está). Para std::multimap , count() puede devolver valores mayores que 1 ya que puede haber varios valores asociados con la misma clave.

     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;
    

    Si solo le importa si existe algún elemento, find es estrictamente mejor: documenta su intención y, para los multimaps , puede detenerse una vez que se haya encontrado el primer elemento coincidente.

  • En el caso de std::multimap , podría haber varios elementos que tengan la misma clave. Para obtener este rango, se utiliza la función equal_range() que devuelve std::pair con un límite inferior (inclusivo) del iterador y un límite superior (exclusivo) respectivamente. Si la clave no existe, ambos iteradores apuntarían a 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