¿Qué representa el mapa STL?[key] volver si la clave no era una clave inicializada en el mapa? [duplicate]

3 minutos de lectura

Avatar de usuario de Mirza
Mirza

Aquí hay un código de ejemplo:

 #include<iostream>
 #include<map>
 #include<string>
 using namespace std;

 int main()
 {
   map<char, string> myMap;
   myMap['a'] = "ahh!!";
   cout << myMap['a'] << endl << myMap['b'] << endl;
   return 0;
 }

En este caso, me pregunto qué hace myMap[‘b’] ¿devolver?

  • Su código ni siquiera se compilará. no has definido a y b.

    – Prasoon Saurav

    23 de febrero de 2011 a las 4:46

  • ‘a’ y ‘b’ son caracteres, no variables. Este código se compilará y es un código válido con variables definidas.

    – jainsha

    18 de julio de 2021 a las 8:00

Avatar de usuario de James McNellis
james mcnellis

Un defecto construido std::string ins insertado en el std::map con llave 'b' y se devuelve una referencia a eso.

A menudo es útil consultar la documentaciónque define el comportamiento de operator[] como:

Devuelve una referencia al objeto que está asociado con una clave particular. Si el mapa aún no contiene tal objeto, operator[] inserta el objeto por defecto data_type().

(La documentación SGI STL no es documentación para la biblioteca estándar de C++, pero sigue siendo un recurso invaluable ya que la mayor parte del comportamiento de los contenedores de la biblioteca estándar es el mismo o muy similar al comportamiento de los contenedores SGI STL).

  • Y (uno de) el autor original de STL escribió la documentación de SGI, creo. Aunque no tengo pruebas y eso puede ser solo un mito de Internet.

    – Martín York

    23 de febrero de 2011 a las 5:48


  • Ese sería Matt Austern. Ha sido un contribuyente importante, durante un período más largo que Stepanov y Lee (quienes a menudo se consideran los autores originales). el tambien escribio Programación Genérica y el STL

    – MSalters

    24 de febrero de 2011 a las 0:28


  • ¿Cuál es el objeto predeterminado? ¿Dónde puedo encontrar una lista de estos? Por ejemplo, ¿el número entero predeterminado es 0?

    -trusktr

    28 de diciembre de 2013 a las 23:39

Se devuelve un objeto construido por defecto (por ejemplo, una cadena vacía en este caso).

En realidad, esto se devuelve incluso cuando dices map['a'] = "ahh!!";. El [] El operador inserta una cadena construida por defecto en la posición ‘a’ y devuelve una referencia a ella, a la que luego se llama el operador =.

Si intenta acceder a un valor clave utilizando el operador de indexación []entonces pueden pasar 2 cosas:

  1. El mapa contiene esta clave. Entonces devolverá el valor clave correspondiente
  2. El mapa no contiene la clave. En este caso será automatically add a key al mapa con key value null.

Como 'b' la clave no está en su mapa, por lo que agregará esta clave con valor ""(cadena vacía) automáticamente e imprimirá esta cadena vacía.

Y aquí el tamaño del mapa aumentará en 1

Entonces, para buscar una clave que pueda usar .find()que volverá map.end() si no se encuentra la clave.
Y no se agregará ninguna clave adicional automáticamente

Y obviamente puedes usar [] operador cuando establece un valor para una clave

std::map operator[] inserta el tipo de valor construido predeterminado en el mapa si la clave proporcionada para la búsqueda no existe. Entonces obtendrá una cadena vacía como resultado de la búsqueda.

¿Ha sido útil esta solución?