2013-02-22 2 views
0

Я пытаюсь найти способ поиска ключа на карте, вернуть его в сообщении, получить значение найденного ключа и вернуть его в другое сообщение. Например, в приведенном ниже классе есть список фруктов, найденных в продуктовом магазине, и я хочу создать оператор if, чем else, чтобы найти имя фрукта на карте, вернуть его имя в приведенном ниже сообщении и затем вернуть его цену на другом выходе , Как я могу это сделать?C++ Найти значение карты и ключ

`

#include <iostream> 
#include <string> 
#include <set> 
#include <map> 
#include<utility> 
using namespace std; 



int main() 
{ 

map<string,double> items; 
items["apples"] = 1.56; 
items["oranges"] = 2.34; 
items["bananas"] = 3.00; 
items["limes"] = 4.45;  
items["grapefruits"] = 6.00;  

string fruit = "apples"; 

//If a fruit is in map 
cout << "Your fruit is: " << "(fruitname value here)" 
    <<"\n"; 
    << "your price is: " <<"(fruitname price here)" 
    << "\n"; 
// return the fruitname and its price 





    return 0; 
} 

До сих пор я видел только примеры, которые показывают, как печатать целые карты из. Самое близкое, что я видел, это тот, который был опубликован по этой ссылке (см. Второй пост): see if there is a key in a map c++, но я смущен синтаксисом, в частности, «buf.c_str()».

ответ

1

Очень просто: функция find член

auto it = items.find(fruit); 

if (it != items.end()) 
{ 
    std::cout << "Your fruit is " << it->first << " at price " << it->second ".\n"; 
} 
else 
{ 
    std::cout << "No fruit '" << fruit << "' exists.\n"; 
} 
1

Используйте map сек.

map<string,double>::const_iterator i = items.find(fruit); 
if(i != items.end()) 
    cout << "Your fruit is: " << i->first << "\n" << "your price is: " << i->second << "\n"; 
+0

Когда я попытался протестировать эту функцию, я получил эту ошибку: «не подходит для оператора =» его отсылая к «если (фрукты = items.end (!)) {» , – Wormhole99

+0

@ Wormhole88: Извините, это должно было быть 'i! = Items.end()'. Я обновил ответ. – amaurea

2

Поскольку ключи к карте являются std::string, вы не должны использовать .c_str(). Вы могли бы пройти сам std::string объект:

auto it = items.find(fruit); //don't pass fruit.c_str() 
if (it != items.end()) 
    std::cout << "value = " << it-second << std::endl; 
else 
    std::cout << ("key '" + fruit + "' not found in the map") << std::endl; 
+0

Этот метод предпочтительнее, чем оператор [] '. 'Operator []' имеет побочный эффект вставки элемента, если элемент не существует. –

+0

@ThomasMatthews: Это не только предпочтительнее, чем 'operator []', это правильно. Использование 'operator []' to * find * element было бы неправильным! – Nawaz

+0

FYI, я говорю о случае 'value = items [" orange "];'. –

Смежные вопросы