2017-02-12 5 views
0

ich, dass jeder Schlüssel (vom Typ string) hält einen Zahlenwert, wie dieseRückkehr Karte Werte vom Typ String mit der Taste

+++++++++++++++ 
key | value 
+++++++++++++++ 
red | 0 
blue | 1 
orange| 3 

etc ...

Gibt es ein ein map<string, int> so einrichten Member-Funktion, die den int-Wert zurückgibt?
ich schon versucht, ähnliche

band1 = band.find("a"); 
band2 = band.find("b"); 
band3 = band.find("c"); 
band4 = band.find("d"); 

wobei a, b, c und d eingegeben Strings finden verwenden, die Indizes in der Karte übereinstimmt, und ich wollte den zurückgegebenen Wert (band1,2,3 haben sollte, 4) um die entsprechende int-Nummer zu sein, aber der Compiler gibt mir einen Fehler.

+0

[ ' std :: map :: at'] (http://en.cppreference.com/w/cpp/container/map/at) Bitte beachten Sie, dass wir von 'std :: map' sprechen. ['find'] (http://en.cppreference.com/w/cpp/container/map/find) gibt zurück, wo in der' map' das gesuchte Objekt zu finden ist, oder den Ende-Iterator, falls es nicht stimmt nicht gefunden. – user4581301

Antwort

0

Schreiben Sie eine Funktion, die std::map und std::vector Schlüssel als Argument benötigt. Und es wird die entsprechenden Werte in std::vector

vector<int> valueReturn(map<string,int> data, vector<string> key) { 
    vector<int> value; 
    for(const auto& it: key) { 
     auto search = data.find(it); 
     if(search != data.end()) { 
      value.push_back(data[it]); 
      std::cout << "Found " << search->first << " " << search->second << '\n'; 
     } 
     else { 
      value.push_back(-1); // Inserting -1 for not found value, You can insert some other values too. Which is not used as value 
      std::cout << "Not found\n"; 
     } 
    } 
    return value; 
} 
+0

Ich verstehe die Logik Ihrer Antwort nicht. OP will nur ein 'int' – user4581301

+0

@ user4581301: Da mehrere Werte nicht von einer Funktion zurückgegeben werden können. Daher gebe ich einen 'std :: vector ' zurück. – Shravan40

+0

Nirgendwo in der Frage heißt es, OP wünscht mehrere Werte. 'std :: map' unterstützt nicht mehrere Schlüssel. Sie würden eine 'std :: multimap' dafür wollen. – user4581301

-1
int band1 = band["a"]; 
int band2 = band["b"]; 
int band3 = band["c"]; 
int band4 = band["d"]; 
+0

Dies hat den Nebeneffekt, dass ein Element zur 'map' hinzugefügt wird und in diesem Fall der Standardwert des neuen Elements 0 zurückgegeben wird, wenn das Element nicht in der' map' enthalten ist. Kann nicht sein, was OP will. – user4581301

3

find gibt einen Iterator zeigte auf den gefundenen Schlüssel-Wert pair (falls vorhanden) zurück. Sie müssen dereferenzieren, dass die tatsächlichen kartiert Wert erhalten iterator:

int band1; 
auto it = band.find("a"); 
if (it != band.end()) 
    band1 = it->second; 
else 
    /* not found ... */; 

Beachten Sie, dass *it gibt uns nur die std::pair zusammen den Schlüssel und kartiert Wert enthält. Um auf den gemappten Wert zuzugreifen, verwenden wir it->second.

Alternativ, wenn Sie wissen, dass der Schlüssel in der map ist, können Sie at verwenden Sie den abgebildeten Wert für diesen Schlüssel zu erhalten:

int band1 = band.at("a"); 

at wird eine out_of_range Ausnahme auslösen, wenn das Element nicht gefunden wird.

Schließlich, wenn Sie den Wert mit der Taste "a" zugreifen wollen, und Sie möchten automatisch den Schlüssel zum map hinzufügen, wenn es nicht bereits vorhanden ist, können Sie den Index-Operator verwenden []:

int band1 = band["a"]; //warning: inserts {a, 0} into the map if not found! 
Verwandte Themen