¿Determinar si el mapa contiene un valor para una clave? [duplicar]

Resuelto Nick Heiner asked hace 14 años • 11 respuestas

¿Cuál es la mejor manera de determinar si un mapa STL contiene un valor para una clave determinada?

#include <map>

using namespace std;

struct Bar
{
    int i;
};

int main()
{
    map<int, Bar> m;
    Bar b = {0};
    Bar b1 = {1};

    m[0] = b;
    m[1] = b1;

    //Bar b2 = m[2];
    map<int, Bar>::iterator iter = m.find(2);
    Bar b3 = iter->second;

}

Al examinar esto en un depurador, parece que iterson solo datos basura.

Si descomento esta línea:

Bar b2 = m[2]

El depurador muestra que b2es {i = 0}. (¿Supongo que significa que el uso de un índice indefinido devolverá una estructura con todos los valores vacíos/no inicializados?)

Ninguno de estos métodos es tan bueno. Lo que realmente me gustaría es una interfaz como esta:

bool getValue(int key, Bar& out)
{
    if (map contains value for key)
    {
        out = map[key];
        return true;
    }
    return false;
}

¿Existe algo en este sentido?

Nick Heiner avatar Jun 29 '10 05:06 Nick Heiner
Aceptado

Siempre que el mapa no sea multimapa, una de las formas más elegantes sería utilizar el método de conteo.

if (m.count(key))
    // key exists

El recuento sería 1 si el elemento está realmente presente en el mapa.

pconnell avatar Aug 01 '2012 18:08 pconnell

¿Existe algo en este sentido?

No. Con la clase de mapa stl, se utiliza ::find()para buscar en el mapa y comparar el iterador devuelto constd::map::end()

entonces

map<int,Bar>::iterator it = m.find('2');
Bar b3;
if(it != m.end())
{
   //element found;
   b3 = it->second;
}

Obviamente puedes escribir tu propia getValue()rutina si quieres (también en C++, no hay razón para usar out), pero sospecho que una vez que aprendas a usarla std::map::find()no querrás perder el tiempo.

Además, tu código es un poco incorrecto:

m.find('2');buscará en el mapa un valor clave que sea '2'. IIRC, el compilador de C++ convertirá implícitamente '2' a un int, lo que da como resultado el valor numérico del código ASCII para '2', que no es lo que desea.

Dado que su tipo de clave en este ejemplo es intel que desea buscar de esta manera:m.find(2);

Alan avatar Jun 28 '2010 22:06 Alan

Me acabo de dar cuenta de que con C++20 , tendremos

bool std::map::contains( const Key& key ) const;

Eso devolverá verdadero si el mapa contiene un elemento con clave key.

kebs avatar Jun 25 '2018 22:06 kebs