2012-10-05 31 views
6

Tengo un mapa con una estructura como un tipo de valorcómo obtener la clave de juego utilizando el valor en un mapa C++

map<int id, struct_t*> table 

struct_t 
{ 
int prev; 
int wt; 
string name; 
} 

Usando sólo anterior, tengo que encontrar el id correspondiente. Muchas gracias de antemano!

EDIT:

int key=0; 
for(auto it = table.begin(); it != table.end(); ++it) 
{ 
    if(table[(*it).first].prev == ?) 
} 

Así es como mi datos del mapa se ve así:

id prev abundance thing 
1573 -1  0  book 
1864 1573 39  beds 
2075 1864 41  tray 
1760 2075 46  cups 

para cada ID, necesito encontrar el siguiente ID coincidente. Así, para 1573 de la columna anterior Necesito encontrar un 'id', que es de 1864. Además, std :: siguiente no funciona porque el conjunto de datos puede tener los identificadores coincidentes no necesariamente en la siguiente element.Hope esto ayuda a juego !

por favor por favor me ayude !!! Mi jefe ya está decepcionado que estoy tomando mucho tiempo para aprender C++

+0

¿Cuál es la clave de la 'map'? – hmjd

+0

¿te refieres al tipo de datos? es int id – snazziii

+3

mapas están destinados a ser buscado en sus llaves, no valores. Tal vez deberías modificar tu diseño o usar otro tipo de contenedor. – arnoo

Respuesta

5

Si usted tiene un compilador moderno (soporta lambdas), puede hacer lo siguiente:

const int prevToFind = 10; 
auto findResult = std::find_if(std::begin(table), std::end(table), [&](const std::pair<int, struct_t*> &pair) 
{ 
    return pair.second->prev == prevToFind; 
}); 

int foundKey = 0; // You might want to initialise this to a value you know is invalid in your map 
struct_t *foundValue = nullptr 
if (findResult != std::end(table)) 
{ 
    foundKey = findResult->first; 
    foundValue = findResult->second; 

    // Now do something with the key or value! 
} 

, hágamelo saber si usted tiene un compilador anterior, y puedo actualizar el ejemplo para usar una clase de predicado en su lugar.

+0

Estoy usando Xcode, así que tengo el compilador Apple LLVM 4.1 – snazziii

+0

Realmente no entiendo esto ... No necesito la estructura, necesito la clave, que es una int. – snazziii

+0

¿Quieres la clave? Parece que tu mapa está al revés ... Es un cambio fácil al código anterior (solo usa findResult-> primero). –

3

bucle simple puede hacerlo (su sido 3 semanas ya!):

#include <map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::map<int, std::string> m = { 
     std::make_pair(0, "zero"), std::make_pair(1, "one"), std::make_pair(2, "two") 
    }; 

    int key = 0; 
    for (auto &i : m) { 
     if (i.second == "two") { 
     key = i.first; 
     break; // to stop searching 
     } 
    } 

    std::cout << key << std::endl; 
} 

Por supuesto que necesita para configurar su propio if-statement para buscar. Tenga en cuenta, impulsar mapa bidireccional podría ser una solución (boost::bimap)

+0

Así que, agregué la dirección en la que me dirijo, ¡pero no sé lo que debería estar comparando en la declaración if! – snazziii

+0

intente 'if (i.second-> prev == the_id_youre_looking_for)' – Hendrik

+0

Esto me parece mucho más simple que la respuesta aceptada. No entiendo por qué esto no tenía ningún voto positivo ... –

3

bucle sobre el mapa, por supuesto, hace el truco, pero es posible que desee considerar el uso de un segundo mapa como un índice:

map<int,int> table_idx; 

Cada vez que añade nuevas entradas a table tendrá que actualizar table_idx y , almacenando el id que corresponde a cada prev. table_idx podrá volver a búsqueda inversa del id en log (N) Tiempo:

int prev_for_id = table_idx[id]; 
+0

¿Qué quieres decir con un bucle sobre el mapa? – snazziii

+0

Me refería al enfoque adoptado en algunas de las respuestas anteriores: iterar sobre cada entrada en el mapa hasta que encuentre el valor cuyo campo 'prev 'es igual al' id' que está buscando. – Hendrik

1

Im que consigue una sensación de que usted es un principiante por lo que sería bueno si nos dijera lo que estás tratando de hacer porque tal vez estás tratando de resolver un problema equivocado.
Como señaló mapas están diseñados para ser buscado por la clave, no el valor.
Dicho esto, si insiste en buscar en el mapa de esta manera probablemente querrá consultar Boost Bimap.

+0

Sí, soy un principiante. ¡He estado luchando con este proyecto durante 3 semanas! Actualizaré la pregunta – snazziii

+0

bien, creo que entiendo su problema. En lo alto de mi cabeza, primero pondría todos los datos en un mapa (con el siguiente campo adicional inicialmente unificado). Luego iría por el mapa completo y por cada clave que tenga value.prev == Y map [Y] -> value.next = X – NoSenseEtAl

+0

No funciona ... ¿qué son X e Y? – snazziii

Cuestiones relacionadas