2017-02-12 7 views
0

Я настроил map<string, int> таким образом, что каждый ключ (тип строки) имеет числовое значение, как этотвозвращение значение карты, используя ключ типа строки

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

и т.д ...

Есть функция-член, которая возвращает значение int?
Я уже пробовал использовать поиск как этого

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

где а, Ь, с, d, вводятся строки, которые должны иметь соответствующие показатели в карте, и я хотел возвращенное значение (band1,2,3, 4), чтобы быть соответствующим номером int, но компилятор дает мне ошибку.

+0

[ ' std :: map :: at'] (http://en.cppreference.com/w/cpp/container/map/at) Имейте в виду, что предполагается, что мы говорим 'std :: map'. ['find'] (http://en.cppreference.com/w/cpp/container/map/find) возвращает, где на« карте »вы можете найти элемент, который вы искали, или конечный итератор, если он был Не нашел. – user4581301

ответ

0

Напишите функцию, которая принимает std::map и std::vector ключа в качестве аргумента. И он будет возвращать соответствующие значения в 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

Я не понимаю логику вашего ответа. OP просто хочет 'int' – user4581301

+0

@ user4581301: Поскольку несколько значений не могут быть возвращены из функции. Поэтому я возвращаю 'std :: vector '. – Shravan40

+0

Нигде в вопросе не говорится, что OP хочет несколько значений. 'std :: map' не поддерживает несколько ключей. Для этого вам понадобится 'std :: multimap'. – user4581301

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

Это имеет побочный эффект добавления элемента в 'map' и возврата значения по умолчанию нового элемента, 0 в этом случае, если элемент не находится в' map'. Не может быть того, чего хочет OP. – user4581301

3

find возвращает итератора указывает на найденный ключ-значение pair (если таковые имеются). Вы должны разыменовать что итератор, чтобы получить реальное отображенное значение:

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

*it Обратите внимание, что только дает нам std::pair, содержащий ключ и отображенное значение вместе. Чтобы получить доступ к отображаемому значению, мы используем it->second.

С другой стороны, если вы знаете, что ключ находится в map, вы можете использовать at, чтобы получить отображенное значение для этого ключа:

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

at выбросит out_of_range исключение, если элемент не найден.

Наконец, если вы хотите получить доступ к значению с помощью ключа "a", и вы хотите, чтобы автоматически добавить, что ключ к map, если он еще не существует, вы можете использовать оператор подстрочного []:

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