2012-10-05 4 views
6

Ich habe eine Karte mit einer Struktur als Wert Typwie passende Schlüssel zu erhalten, den Wert in einer Karte C++

map<int id, struct_t*> table 

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

Mit nur zurück, ich brauche die entsprechende ID zu finden. Vielen Dank im Voraus!

EDIT:

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

Dies ist, wie meine Kartendaten wie folgt aussieht:

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

Für jede ID, muss ich die nächste passende ID finden. Also, für 1573 von der vorherigen Spalte muss ich eine passende 'ID' finden, die 1864 ist. Auch std :: next funktioniert nicht, weil der Datensatz die passenden IDs nicht unbedingt im nächsten Element haben kann. Das hilft !

BITTE BITTE helfen Sie mir !!! Mein Chef ist schon enttäuscht, dass ich so viel Zeit nehme mich zu lernen, C++

+0

Was ist der Schlüssel der 'Karte'? – hmjd

+0

meinst du den Datentyp? Es ist int id – snazziii

+3

Karten sollen auf ihren Schlüsseln gesucht werden, nicht Werte. Vielleicht sollten Sie Ihr Design optimieren oder eine andere Art von Container verwenden. – arnoo

Antwort

5

sein Wenn Sie einen modernen Compiler haben (unterstützt lambdas), können Sie Folgendes tun:

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

Lassen Sie mich wissen, wenn Sie ein älterer Compiler, und ich kann das Beispiel aktualisieren, um stattdessen eine Prädikatklasse zu verwenden.

+0

Ich benutze Xcode, also habe ich Apple LLVM 4.1 Compiler – snazziii

+0

Ich verstehe das nicht wirklich .. Ich brauche die Struktur nicht, ich brauche den Schlüssel, der ein int ist. – snazziii

+0

Sie wollen den Schlüssel? Es klingt wie Ihre Karte ist rückwärts ... Es ist eine einfache Änderung an den obigen Code (nur findResult-> zuerst). –

3

Einfache Schleife kann es tun (seine seit 3 ​​Wochen schon!):

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

Natürlich müssen Sie Ihre eigenen einrichten if-Anweisung für die Suche. Bitte beachten Sie, bidirektionale Karte aufladen könnte eine Lösung (boost::bimap)

+0

Also fügte ich die Richtung hinzu, in die ich gehe, aber ich weiß nicht, was ich in der if-Anweisung vergleichen sollte! – snazziii

+0

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

+0

Dies sieht viel einfacher für mich als die angenommene Antwort. Ich verstehe nicht, warum das keine Up-Stimmen hatte ... –

3

Looping über die Karte natürlich funktioniert der Trick, aber Sie können mit einer zweiten Karte als Index betrachten wollen:

map<int,int> table_idx; 

Jedes Mal, wenn Sie neue Einträge hinzufügen zu table Sie müssen aktualisieren table_idx auch Speichern der id, die jeder prev entspricht. table_idx wird dann können Sie die id in log (N) Zeit Reverse-Lookup:

int prev_for_id = table_idx[id]; 
+0

was meinst du mit einem Looping über die Karte? – snazziii

+0

Ich bezog mich auf den Ansatz, der in einigen der obigen Antworten übernommen wurde: Iterieren über jeden Eintrag in der Karte, bis Sie den Wert finden, dessen "prev" -Feld gleich der ID ist, nach der Sie suchen. – Hendrik

1

Im immer das Gefühl, dass Sie ein Anfänger sind, so wäre es schön, wenn Sie uns sagen würde, was wollen Sie tun weil du vielleicht ein falsches Problem lösen willst.
Wie bekannte Karten sind entworfen, um durch den Schlüssel, nicht Wert gesucht werden.
Das gesagt wird, wenn Sie darauf bestehen, die Karte auf diese Weise zu suchen, werden Sie wahrscheinlich überprüfen möchten Boost Bimap.

+0

Ja, ich bin ein Anfänger. Ich habe jetzt seit 3 ​​Wochen mit diesem Projekt gekämpft! Ich werde die Frage aktualisieren – snazziii

+0

ok, ich denke, verstehe dein Problem. Von Anfang an würde ich zuerst alle Daten in einer Karte ablegen (mit zusätzlichem Feld, das als nächstes unitialisiert wird). Dann würde ich durch die gesamte Karte gehen und für jede Taste, die value.prev == Y hat map [Y] -> value.next = X – NoSenseEtAl

+0

Es funktioniert nicht .. was sind X und Y? – snazziii

Verwandte Themen