¿Determinar si el mapa contiene un valor para una clave? [duplicar]
¿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 iter
son solo datos basura.
Si descomento esta línea:
Bar b2 = m[2]
El depurador muestra que b2
es {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?
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.
¿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 int
el que desea buscar de esta manera:m.find(2);
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
.