Estoy tratando de verificar si una clave dada está en un mapa y de alguna manera no puedo hacerlo:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
Entonces, ¿cómo puedo imprimir lo que está en p?
c++
dictionary
stl
No hay nada que podemos hacer
fuente
fuente
std::pair<iterator,bool> insert( const value_type& value );
¿Cuál es el bool que devuelve? ¿dice si la clave ya está presente o no?Respuestas:
Utilizar
map::find
fuente
map::count
count
devuelve unint
tiempofind
devuelve un iterador completo. Guarda la construcción del iterador :) Obviamente, si luego va a usar el valor si existe, use find y almacene su resultado.count
yfind
son casi idénticos en velocidad cuando usan mapas que requieren claves únicas. (1) Si no necesita los elementos para mantener un orden específico, use std :: unordered_map , que tiene búsquedas casi constantes y puede ser muy beneficioso al almacenar más de unos pocos pares. (2) Si desea usar el valor si existe, almacene el resultado de :: find y use el iterador para evitar 2 búsquedas:auto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
Para verificar si existe una clave particular en el mapa, use la
count
función miembro de una de las siguientes maneras:La documentación de
map::find
dice: "Otra función miembromap::count
, puede usarse para verificar si existe una clave en particular".La documentación de
map::count
dice: "Debido a que todos los elementos en un contenedor de mapas son únicos, la función solo puede devolver 1 (si se encuentra el elemento) o cero (de lo contrario)".Para recuperar un valor del mapa a través de una clave que sabe que existe, use map :: at :
A diferencia de map :: operator [] ,
map::at
no creará una nueva clave en el mapa si la clave especificada no existe.fuente
find
lugar. Elsecond
atributo del iterador devuelto porfind
se puede utilizar para recuperar el valor de la clave. Si usacount
entoncesat
ooperator[]
está realizando dos operaciones cuando podría haber usado solo una.if(m.count(key))
int
abool
. Aunque hay otros compiladores de C ++ que no emiten una advertencia similar, prefiero usar una comparación explícita para aclarar la intención y mejorar la legibilidad. Tenga en cuenta que otros lenguajes como C # prohíben una conversión tan implícita para evitar la posibilidad de introducir errores de programación sutiles.C ++ 20 nos da
std::map::contains
para hacer eso.fuente
Puedes usar
.find()
:fuente
Si desea utilizar otra API, busque ir a
m.count(c)>0
fuente
Creo que quieres
map::find
. Sim.find("f")
es igual am.end()
, entonces no se encontró la clave. De lo contrario, find devuelve un iterador que apunta al elemento encontrado.El error se debe a que
p.first
es un iterador, que no funciona para la inserción de secuencias. Cambia tu última línea acout << (p.first)->first;
.p
es un par de iteradores,p.first
es un iterador,p.first->first
es la cadena clave.Un mapa solo puede tener un elemento para una clave determinada, por
equal_range
lo que no es muy útil. Está definido para el mapa, porque está definido para todos los contenedores asociativos, pero es mucho más interesante para los mapas múltiples.fuente
C++17
simplificado esto un poco más con unIf statement with initializer
. De esta manera puedes tener tu pastel y comértelo también.fuente
la clave de verificación existe o no, y el número de retorno ocurre (0/1 en el mapa):
la clave de verificación existe o no, y devuelve el iterador:
en su pregunta, el error causado por una mala
operator<<
sobrecarga, porquep.first
esmap<string, string>
, no puede imprimirlo. prueba esto:fuente
cout
puede significar algo muy diferente acount
Por supuesto, si desea ser más elegante, siempre puede crear una función que también tome una función encontrada y una función no encontrada, algo como esto:
Y úsalo así:
La desventaja de esto es que viene con un buen nombre, "find_and_execute" es incómodo y no se me ocurre nada mejor en la parte superior de mi cabeza ...
fuente
Tenga cuidado al comparar el resultado de búsqueda con el final, como para el mapa 'm', ya que todas las respuestas se han hecho sobre map :: iterator i = m.find ("f");
no debe intentar realizar ninguna operación, como imprimir la clave o el valor con el iterador i si es igual a m.end () de lo contrario, provocará un error de segmentación.
fuente
Comparando el código de std :: map :: find y std :: map :: count, diría que el primero puede proporcionar alguna ventaja de rendimiento:
fuente
Sé que esta pregunta ya tiene algunas buenas respuestas, pero creo que vale la pena compartir mi solución.
Funciona para ambos
std::map
ystd::vector<std::pair<T, U>>
está disponible en C ++ 11.fuente
Si desea comparar un par de mapas, puede usar este método:
Esta es una técnica útil.
fuente
fuente