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::findfuente
map::countcountdevuelve uninttiempofinddevuelve 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.countyfindson 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
countfunción miembro de una de las siguientes maneras:La documentación de
map::finddice: "Otra función miembromap::count, puede usarse para verificar si existe una clave en particular".La documentación de
map::countdice: "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::atno creará una nueva clave en el mapa si la clave especificada no existe.fuente
findlugar. Elsecondatributo del iterador devuelto porfindse puede utilizar para recuperar el valor de la clave. Si usacountentoncesatooperator[]está realizando dos operaciones cuando podría haber usado solo una.if(m.count(key))intabool. 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::containspara hacer eso.fuente
Puedes usar
.find():fuente
Si desea utilizar otra API, busque ir a
m.count(c)>0fuente
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.firstes un iterador, que no funciona para la inserción de secuencias. Cambia tu última línea acout << (p.first)->first;.pes un par de iteradores,p.firstes un iterador,p.first->firstes la cadena clave.Un mapa solo puede tener un elemento para una clave determinada, por
equal_rangelo 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++17simplificado 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.firstesmap<string, string>, no puede imprimirlo. prueba esto:fuente
coutpuede significar algo muy diferente acountPor 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::mapystd::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