Esta respuesta SO dice que el Mapa STL con un Vector para la Clave, el vector puede usarse como una clave. Entonces cuando usamos un vector como clave. ¿Cómo funciona eso realmente, ya que la clave debe ser única, de modo que cuando insertemos otro vector con los mismos elementos, la map
comprobación de elementos duplicados por elemento o el nombre del vector especifica algo? Al igual que el nombre de la matriz representa la dirección base. Por lo tanto, una matriz se puede usar como una clave ya que la dirección base se puede usar como una clave en este caso, pero cuál es la clave en el caso de un vector. ¿Cómo funciona internamente?
Porque cuando imprimo el nombre del vector, obtengo un error
vector<int> v;
cout<<v; //error
has operators == and <
¿Cómo ayuda eso? mi pregunta era verificar que los elementos duplicadosstd::vector
como clave parastd::map
. Pagas por lo que usas . Se puede hacer, y tal vez hay algunos casos de uso para eso, pero ciertamente puede cambiar su estructura de datos de elección. Los contenedores STL están diseñados para ser lo más versátiles y utilizables de cualquier forma que el usuario quiera usar.std::map
copiará tanto la clave como el valor en sí mismo.std::unordered_map
puede almacenar hash de la clave.Respuestas:
Hay un operador sobrecargado <para la plantilla de clase std :: vector.
eso se basa en el algoritmo estándar
std::lexicographical_compare
.Aquí hay un programa demostrativo.
Su salida es
Entonces la clase se puede usar como clave en el mapa.
Por defecto, el mapa de plantilla de clase usa el objeto de función std :: less que a su vez usa el operador <
Sin embargo, no hay un operador sobrecargado << para la plantilla de clase std :: vector.
fuente
El nombre de un objeto y el contenido de ese objeto son siempre cosas no relacionadas.
operator ==
forstd::vector
primero comparará la longitud de los vectores y luego cada uno de sus elementosoperator ==
también.operator <
compara elementos en vector lexicográficamente, es decir, devuelvex[i] < y[i]
el primer elemento no igual en vectoresx
yy
.Estos son los requisitos que
std::map
tiene para un tipo utilizado comoKey
. Comostd::vector
satisface a ambos, puede ser usado por asKey
. Tenga en cuenta que el tipo administrado por vector también debe tener estos operadores sobrecargados para que esto funcione (porquestd::vector
depende de esos operadores para implementar sus propios operadores).fuente