unordered_set unordered_map unordered example c++ stl c++11 unordered-map

c++ - unordered_set - unordered_map example



¿Por qué no puedo reemplazar std:: map con std:: unordered_map (2)

Supongo que porque std :: unordered_map necesita volver a generar, y por lo tanto copiar elementos, los tipos deben completarse, mientras que un mapa, que solo trabaja con punteros a elementos, no mostrará ese problema.

La solución aquí es tener un mapa desordenado a un puntero:

std::unordered_map<uint32_t, std::shared_ptr<Test> >.

Esta pregunta puede ser un poco incompleta porque no tengo el código disponible en casa, pero sé que esto me molestará durante todo el fin de semana.

Cuando traté de actualizar un código a C ++ 11 comencé a reemplazar algunos std::map con std::unordered_map . El código solo usa std::map::find() para acceder a un elemento específico en el mapa, así que pensé que el reemplazo debería ser fácil. El iterador devuelto se almacenó en una variable de tipo auto res = map.find( x ) ( auto res = map.find( x ) , por lo que el tipeo debería ser auto res = map.find( x ) . Sin embargo, al acceder al elemento almacenado usando res->second.do_stuff() obtuve un error de compilación , diciéndome que struct std::pair<char, B> does not have a member second . Ahora esto realmente me confundió, pero lamentablemente no tuve tiempo de investigar más.

Tal vez esto es suficiente información, por lo que alguien puede darme una pista sobre este extraño error del compilador. ¿O entiendo que std::map y std::unordered_map deberían tener la misma interfaz excepto las partes que necesitan un pedido, no son correctas?

EDITAR :

Como prometí aquí algunos análisis más sobre el problema. Lo más probable es que esto permita que alguien me ayude mejor ahora. Como adiviné por las sugerencias en los comentarios, esto no fue causado por el punto donde accedí a los elementos en el mapa, sino por alguna otra parte del código. La razón que encontré fue que utilicé el mapa dentro de la Clase X para almacenar punteros a otros elementos de la Clase X (un tipo de estructura de árbol). Sin embargo, esto parece funcionar para std::map pero no para std::unordered_map . Aquí hay un código muy simple que muestra el problema:

#include <stdint.h> #include <unordered_map> #include <map> class Test { std::map<uint32_t, Test> m_map1; // Works std::unordered_map<uint32_t, Test> m_map; // gives error: ‘std::pair<_T1, _T2>::second’ has incomplete type }; int main() { return 1; }

std::map funciona std::unordered_map no funciona. ¿Alguna idea de por qué es este el caso o qué se puede hacer para que funcione con un std::unordered_map ?


Usar tanto map como unordered_map con tipos incompletos implica comportamiento indefinido:

En particular, los efectos no están definidos en los siguientes casos:

[...]

- si se utiliza un tipo incompleto (3.9) como argumento de plantilla al crear una instancia de un componente de plantilla, a menos que esté específicamente permitido para ese componente.