2012-10-05 13 views
6

ho una mappa con una struttura come un tipo di valorecome ottenere chiave corrispondenti utilizzando il valore in una mappa C++

map<int id, struct_t*> table 

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

Utilizzando solo prev, ho bisogno di trovare l'ID corrispondente. Grazie mille in anticipo!

EDIT:

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

Ecco come il mio i dati della mappa si presenta come:

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

per ogni ID, ho bisogno di trovare la prossima id corrispondente. Quindi, per 1573 dalla colonna prev ho bisogno di trovare un 'id' corrispondente che sia 1864. Inoltre, std :: next non funziona perché il set di dati può avere gli id ​​corrispondenti non necessariamente nell'elemento successivo. Spero che questo aiuti !

FAVORE please help me !!! Il mio capo è già deluso dal fatto che mi sto prendendo così tanto tempo per imparare il C++

+0

Qual è la chiave del 'map'? – hmjd

+0

intendi il tipo di dati? è int id – snazziii

+3

Le mappe devono essere cercate sulle loro chiavi, non sui valori. Forse dovresti ritoccare il tuo design o usare un altro tipo di contenitore. – arnoo

risposta

5

Se hai un compilatore moderno (supporta lambda), è possibile effettuare le seguenti operazioni:

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! 
} 

fatemi sapere se avete un compilatore più vecchio e posso aggiornare l'esempio per utilizzare invece una classe di predicati.

+0

Sto usando Xcode quindi ho il compilatore Apple LLVM 4.1 – snazziii

+0

Non lo capisco davvero .. Non ho bisogno della struttura, ho bisogno della chiave che è un int. – snazziii

+0

Vuoi la chiave? Sembra che la tua mappa sia indietro ... È un semplice cambiamento al codice precedente (usa findResult-> first). –

3

semplice ciclo può farlo (il suo stato di 3 settimane già!):

#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; 
} 

Naturalmente è necessario impostare il proprio if-statement per la ricerca. Si prega di notare, aumentare la mappa bidirezionale potrebbe essere una soluzione (boost::bimap)

+0

Così, ho aggiunto la direzione in cui mi sono diretto, ma non so che cosa dovrei confrontando nel if! – snazziii

+0

provare 'if (i.second-> prec == the_id_youre_looking_for)' – Hendrik

+0

Questo sembra molto più semplice per me che la risposta accettata. Non capisco perché questo non ha avuto voti positivi ... –

3

Looping sopra la mappa naturalmente fa il trucco, ma si potrebbe voler considerare l'utilizzo di una seconda mappa come indice:

map<int,int> table_idx; 

Ogni volta che si aggiungono nuove voci alla table è necessario aggiornare table_idx pure , memorizzando il numero id corrispondente a ogni prev. table_idx allora permetterà di ricerca inversa il id a log (N) tempo:

int prev_for_id = table_idx[id]; 
+0

cosa intendi con il looping sulla mappa? – snazziii

+0

Mi riferivo all'approccio adottato in alcune delle risposte di cui sopra: iterando su ogni voce della mappa fino a trovare il valore il cui campo 'prev' è uguale a' id' che si sta cercando. – Hendrik

1

Im ottenendo una sensazione che sei un principiante quindi sarebbe bello se ci dirà che cosa stai cercando di fare perché forse stai cercando di risolvere un problema sbagliato.
Come le mappe note sono progettate per essere ricercate dalla chiave, non il valore.
Detto questo se ti ostini a cercare la mappa in questo modo si problably desiderare di check-out Boost Bimap.

+0

Sì, sono un principiante. Ho lottato con questo progetto per 3 settimane ora! Aggiornerò la domanda – snazziii

+0

ok, penso di capire il tuo problema. In cima alla mia testa vorrei prima mettere tutti i dati in una mappa (con il campo aggiunto successivo che è inizialmente unitializzato). Poi passerei attraverso l'intera mappa e per ogni chiave che ha value.prev == Y do map [Y] -> value.next = X – NoSenseEtAl

+0

Non funziona ... cosa sono X e Y? – snazziii

Problemi correlati