2017-02-27 34 views
0

this example是最接近的我已經瞭解如何在C++中搜索地圖,我仍然需要幫助。如何在C++中搜索地圖

我爲電話簿創建了一張地圖。

map<string,int> PhBook; 

現在我讓用戶給它添加姓名和電話。

getline(cin >> ws,name); 
cin >> phone; 
PhBook[name] = phone; 

我想要做的就是也讓在地圖和打印「手機= ......」或「未找到」因此消息可能名稱的用戶搜索。

那麼我該如何做到這一點?我想要最簡單的解決方案,因爲我是一個新手。我的困難在於我不知道如何使用元素(人名)搜索地圖。

+4

將您的C++書籍打開到地圖上的章節。我相信你的書解釋瞭如何使用map的find()方法。 –

+0

你可以使用'std :: map :: const_iterator result = PhBook.find(input);如果(result == PhBook.end())「cout <<」name not found「<< endl; else cout <<」phone「< second << std :: endl;' –

+0

cppreference示例顯示瞭如何做你在問什麼,你不瞭解哪部分或者沒有做你想做的事? –

回答

2

這裏地圖返回一個迭代器,如果發現了,否則它返回一個迭代器map::end

map<string,int> ::iterator it; 
it = PhBook.find(name); 

if (it != PhBook.end()){ 
    cout<<"The phone = "<<it->second<<endl; 
}else{ 
    cout<<"Not found"<<endl; 
} 
0

有您能做到發現一個STL(標準模板庫)地圖的關鍵多種方式。您可以使用已由STL庫提供的方法,也可以使用自己的方法完成相同的任務。我會盡量提供一些可以幫助您解決問題的技巧。 1-)正如前一篇文章中已經提到的,你可以定義一個std :: Map的迭代器,並將find函數的結果賦給一個已經定義好的迭代器。但是,有時聲明迭代器會變得混亂。例如,如果你碰巧定義一個嵌套的地圖對象

std::map<std::string, std::map<std::string, int>> dict; 
dict["name"]["phone"] = 1234; 

在這種情況下,當你想定義上述類型的迭代器,你將不得不宣佈,

std::map<std::string, std::map<std::string, int>>::iterator it = dict.begin(); 

不必花爲了能夠聲明一個迭代器這麼多的努力是瘋狂和耗時的。幸運的是,C++ 11帶有auto關鍵字,可在編譯時自動推導出類型。這是我發現auto關鍵字最有利的唯一地方。帶自動關鍵字,

auto it = dict.begin(); /*or*/ auto it = dict.find(name) 

是您所需要的全部。

2-)當指針用於一維連續數據類型(如數組)時,迭代器會給出指針錯覺。但是,STL容器可能不會在內存上連續分發數據(鏈接列表,二叉樹是典型示例),而是可以遍佈堆棧。爲了給出指針算術的錯覺和使用迭代器是有用的抽象。 C++ 11基於範圍的循環可以很好地替代迭代器。

std::map<std::string, int> dict; 
for(auto & kv : dict){ /* Program logic goes here */ } 

在這種情況下,kv將包含鍵值對並且是std :: pair的類型。

3-)您可以使用std :: count方法:: Map來檢查映射中是否存在鍵。 countfind之間的區別是count返回一個數值,而find返回一個迭代器。

+0

我接近理解。 ) - >秒。那東西輸出值o f我需要的鑰匙。關於您的解決方案的第(3)部分,PhBook.count(名稱)帶有一個整數權限?我發現人們使用它作爲布爾值的例子。在我的代碼中遇到了一些問題,只要我修復它們就會更新並選擇最佳答案。 – Lev

+0

std :: Map的返回值的count方法是size_t。 size_t是一個無符號值的別名,它能夠代表一個對象的大小(對象不一定是C++對象,任何存儲在內存中並可通過變量訪問的對象都稱爲對象)。查看[資源](http://www.embedded.com/electronics-blogs/programming-pointers/4026076/1/Why-size-t-matters)瞭解更多關於size_t的信息。 Bool類型可以被認爲是隻接收1和0的值的另一個整數類型。任何大於或小於0的值都被轉換爲1,因此對應於true。 – ugar