Std::unordered map equality depende del orden de inserción


Si crea dos contenedores std::unordered_map utilizando el mismo conjunto de pares clave-valor (no iguales), pero insertados en un orden diferente (por lo que los contenedores contienen elementos iguales, pero potencialmente en diferentes órdenes), los contenedores están garantizados para ser iguales, de acuerdo con el operador de igualdad (operator==). Asumo que los operadores de código hash e igualdad de los elementos contenedor satisfacen todas las restricciones requeridas en su implementación.

Author: Baum mit Augen, 2018-08-06

3 answers

Sí, están garantizados para devolver igual en este caso. La redacción específica (de N4659, §[unord.req] / 12) es:

Dos contenedores desordenados a y b comparan igual si a.size() == b.size() y, para cada grupo de clave equivalente [Ea1, Ea2) obtenido de a.equal_range(Ea1), existe un grupo de clave equivalente [Eb1, Eb2) obtenido de b.equal_range(Ea1), de modo que is_permutation(Ea1, Ea2, Eb1, Eb2) devuelve true.

Por lo tanto, siempre y cuando las claves (y los valores asociados) en uno son los mismos que el otro (pero posiblemente en un orden), se comparará igual.

 30
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 16:53:45

De [unord.rojo]/12

Dos contenedores desordenados a y b comparan igual si a.size() == b.size() y, para cada grupo de clave equivalente [Ea1, Ea2) obtenido de a.equal_­range(Ea1), existe un grupo de clave equivalente [Eb1, Eb2) obtenido de b.equal_­range(Ea1), de modo que is_­permutation(Ea1, Ea2, Eb1, Eb2) devuelve true. [...]

Así que, mientras las llaves sean iguales y el tamaño sea el mismo, los contenedores se compararán igual sin importar en qué orden estén las llaves.

 13
Author: NathanOliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-06 15:33:46

A continuación están las citas de cppreference.com acerca de la std: unordered_map, operator==,!= (std::unordered_map):

El contenido de dos contenedores desordenados lhs y rhs son iguales si se cumplen las siguientes condiciones:

  • lhs.tamaño () = = rhs.tamaño ()
  • cada grupo de elementos equivalentes [lhs_eq1, lhs_eq2) obtenido de lhs.equal_range (lhs_eq1) tiene un grupo correspondiente de elementos equivalentes en el otro contenedor [rhs_eq1, rhs_eq2) obtenido de rhs.equal_range(rhs_eq1), que tiene las siguientes propiedades:
    • std:: distance (lhs_eq1, lhs_eq2) = = std::distance(rhs_eq1, rhs_eq2).
    • std:: is_permutation (lhs_eq1, lhs_eq2, rhs_eq1) == true.

Tenga en cuenta que:

El comportamiento es indefinido si Key o T no son EqualityComparable.

El comportamiento también es indefinido si Hash y KeyEqual hacen (hasta C++20)KeyEqual hace (desde C++20) no tienen el mismo comportamiento en lhs y rhs o si el operador== para la Llave no es un refinamiento de la partición en equivalente de grupos clave introducidas por KeyEqual (es decir, si dos elementos que comparar la igualdad de usar el operador== dividen en particiones diferentes)

Finalmente, a considerar es la complejidad:

Proporcional a N llamadas al operador = = en value_type, llamadas al predicado devueltas por key_eq, y llamadas al hasher devueltas por hash_function, en el caso promedio, proporcional a N2 en el peor de los casos donde N es el tamaño del contenedor.

Por lo tanto, si ambos mapas desordenados tienen el mismo tamaño, y cada clave en uno de los contenedores se busca en el otro más, si sucede que se encuentra entonces sus valores se comparan entonces se consideran los mismos.

 3
Author: acarlstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-06 15:36:02