2011-10-23 20 views
7

Estoy buscando una función en C++ que para intercambiar los contenidos de un mapa ... que es: aquellos que eran las claves ahora se convierten en los elementos y aquellos que los artículos eran ahora las llaves. ¿Me puede decir si hay algo sobre esto?Intercambiando claves y valores de un mapa en C++

+5

Es posible que desee hacer esto para multimaps, ya que los valores en un mapa no son necesariamente distintos. –

+0

Estoy seguro de que los valores de mi mapa son todos únicos: No hay duplicado – Safari

Respuesta

13

Como dijo Geoffroy, std::map no permite este comportamiento. Sin embargo, es posible que desee utilizar un contenedor de tipo STL Boost.Bimap - mapa bidireccional.

Un Bimap es una estructura de datos que representa las relaciones bidireccionales entre los elementos de dos colecciones. El contenedor está diseñado para funcionar como dos mapas STL opuestos. Un bimap entre una colección X y una colección Y se puede ver como un mapa de X a Y (esta vista se llamará vista de mapa izquierda) o como un mapa de Y a X (conocida como la vista de mapa correcta).

1

No hay un método/forma estándar para hacer esto, tiene que escribir su propia función.

No es algo muy difícil de hacer, pero primero piense en hacerlo de otra manera.

Si tiene que invertir sus claves/valores, entonces su código puede estar mal, aunque no mantenga la lógica del contenedor.

Si desea obtener más información, explique por qué desea hacer esto.

+0

Creo que impulsar tiene un adaptador de iterador que podría hacer esto fácil –

+0

Sí, tal vez, no sé mucho sobre impulso por el momento . Pero no es muy difícil de hacer. – Geoffroy

+0

Tengo que leer un archivo que tomó la cadena de Id. De fila. Necesito para mis algoritmos que este valor sea un número entero (por razones de eficiencia y no una cadena) use un mapa para asociar con estas cadenas una identificación única. En el mapa, entonces intID-string. Necesito tener los resultados de mi algoritmo en mi id-cadena de formato antiguo, así que tengo, para cada cadena de búsqueda IdInt en todos los valores correspondientes del mapa. Para acelerar esto puede hacer un intercambio – Safari

1

Primero inserte los elementos en el mapa en un multimap - valor, segundo clave, con la función de comparación adecuada que compara dos valores del mapa original. Una vez que se insertan todos los elementos de valor clave, el multimapa se ordenará según lo previsto. ¡Trabajo hecho!

1
template <class T1, class T2> 
map<T2, T1> swapPairs(map<T1, T2> m) { 
    map<T2, T1> m1; 

    for (auto&& item : m) { 
     m1.emplace(item.second, item.first); 
    } 

    return m1; 
}; 

int main() { 
    map<string, int> m; 
    m.emplace("111",5); 

    cout << m.at("111") << endl; // 5 

    map<int,string> m1 = swapPairs(m); 

    cout << m1.at(5) << endl; // 111 

    return 0; 
} 
Cuestiones relacionadas