C++中的map使用方法詳解
C++中的map
map的介紹
map是一種使用鍵值對的數(shù)據(jù)結(jié)構(gòu),它允許我們使用鍵來查找值。map中的鍵必須是唯一且有序的,而值可以重復(fù)并且沒有特定的順序。
map中的數(shù)據(jù)以樹結(jié)構(gòu)進(jìn)行組織,其中每個(gè)節(jié)點(diǎn)都由一個(gè)鍵和一個(gè)值組成。根據(jù)鍵的大小,節(jié)點(diǎn)被插入到正確的位置以保持樹的有序性。這使得在map中查找值非常高效,因?yàn)槲覀兛梢允褂枚植檎襾砜焖俣ㄎ恢怠?/p>
創(chuàng)建和初始化map
我們可以使用C++標(biāo)準(zhǔn)庫中的map頭文件來創(chuàng)建和初始化一個(gè)map。以下示例展示了如何創(chuàng)建一個(gè)map并將幾個(gè)鍵值對添加到其中:
#include <iostream> #include <map> using namespace std; int main() { // 創(chuàng)建一個(gè)空的map map<int, string> myMap; // 向map中添加鍵值對 myMap.insert(pair<int, string>(1, "apple")); myMap.insert(pair<int, string>(2, "banana")); myMap.insert(pair<int, string>(3, "cherry")); // 輸出map中的元素 for (auto it = myMap.begin(); it != myMap.end(); ++it) { cout << it->first << " : " << it->second << endl; } return 0; }
輸出:
1 : apple
2 : banana
3 : cherry
在上面的示例中,我們首先創(chuàng)建了一個(gè)空的map,然后使用insert()函數(shù)將一些鍵值對添加到其中。最后,我們使用迭代器遍歷該map并輸出每個(gè)鍵值對。
我們還可以使用初始化列表來初始化map。以下示例展示了如何使用初始化列表來創(chuàng)建并初始化一個(gè)map:
map<string, int> myMap { {"apple", 1}, {"banana", 2}, {"cherry", 3} };
map中的查找操作
向map中添加元素后,我們可以使用其鍵來查找相應(yīng)的值。使用find()方法可以在map中查找給定鍵的值。如果鍵存在,則find()方法返回指向該元素的迭代器。否則,它將返回指向map結(jié)尾的迭代器。
以下示例展示了如何在map中查找值:
#include <iostream> #include <map> using namespace std; int main() { map<string, int> myMap { {"apple", 1}, {"banana", 2}, {"cherry", 3} }; // 在map中查找元素 auto it = myMap.find("apple"); if (it != myMap.end()) { cout << "apple is found" << endl; } else { cout << "apple is not found" << endl; } it = myMap.find("pear"); if (it != myMap.end()) { cout << "pear is found" << endl; } else { cout << "pear is not found" << endl; } return 0; }
輸出:
apple is found
pear is not found
在上面的示例中,我們首先創(chuàng)建了一個(gè)map并向其中添加了一些鍵值對。然后,我們使用find()方法在map中查找給定的鍵,如果找到則輸出相應(yīng)的消息。
map的刪除操作
我們可以使用erase()方法從map中刪除元素。erase()函數(shù)需要一個(gè)迭代器作為參數(shù),可以使用find()方法查找迭代器,然后使用erase()方法來刪除元素。以下示例展示了如何從map中刪除特定鍵值對:
#include <iostream> #include <map> using namespace std; int main() { map<string, int> myMap { {"apple", 1}, {"banana", 2}, {"cherry", 3} }; // 刪除map中的某個(gè)元素 auto it = myMap.find("apple"); if (it != myMap.end()) { myMap.erase(it); } // 輸出map中的元素 for (auto it = myMap.begin(); it != myMap.end(); ++it) { cout << it->first << " : " << it->second << endl; } return 0; }
輸出:
banana : 2
cherry : 3
在上面的示例中,我們首先創(chuàng)建了一個(gè)map并向其中添加了一些鍵值對。然后,我們使用find()方法查找要?jiǎng)h除的元素
接下來我們來看看如何在map中遍歷元素、如何使用自定義比較器排序map,以及如何使用lower_bound()和upper_bound()方法進(jìn)行范圍查找。
map的遍歷操作
我們可以使用迭代器來遍歷map中的元素。以下示例展示了如何使用迭代器遍歷map:
#include <iostream> #include <map> using namespace std; int main() { map<string, int> myMap { {"apple", 1}, {"banana", 2}, {"cherry", 3} }; // 輸出map中的元素 for (auto it = myMap.begin(); it != myMap.end(); ++it) { cout << it->first << " : " << it->second << endl; } return 0; }
輸出:
apple : 1
banana : 2
cherry : 3
在上面的示例中,我們使用迭代器遍歷map中的所有元素,并輸出每個(gè)鍵值對。
在map中使用自定義比較器排序
默認(rèn)情況下,map按鍵的升序進(jìn)行排序。如果我們要按照其他方式進(jìn)行排序,我們可以使用一個(gè)自定義比較器來指定排序的規(guī)則。以下示例展示了如何使用自定義比較器按值進(jìn)行排序:
#include <iostream> #include <map> using namespace std; bool myComp(const pair<string, int>& a, const pair<string, int>& b) { return a.second > b.second; } int main() { map<string, int> myMap { {"apple", 1}, {"banana", 2}, {"cherry", 3} }; // 按值排序 vector<pair<string, int>> vec(myMap.begin(), myMap.end()); sort(vec.begin(), vec.end(), myComp); // 輸出排序后的結(jié)果 for (auto it = vec.begin(); it != vec.end(); ++it) { cout << it->first << " : " << it->second << endl; } return 0; }
輸出:
cherry : 3
banana : 2
apple : 1
在上面的示例中,我們定義了一個(gè)自定義比較器函數(shù)myComp來按值對map進(jìn)行排序。然后,我們將map中的鍵值對存儲在一個(gè)vector中,并使用自定義比較器來進(jìn)行排序。最后,我們遍歷已排序的vector并輸出相應(yīng)的鍵值對。
使用lower_bound()和upper_bound()進(jìn)行范圍查找
我們可以使用lower_bound()和upper_bound()方法來查找map中一定范圍內(nèi)的鍵值對。lower_bound()函數(shù)返回指向第一個(gè)大于等于給定鍵的元素的迭代器,而upper_bound()函數(shù)返回指向第一個(gè)大于給定鍵的元素的迭代器。
以下示例展示了如何使用lower_bound()和upper_bound()方法查找map中給定范圍的鍵值對:
#include <iostream> #include <map> using namespace std; int main() { map<string, int> myMap { {"apple", 1}, {"banana", 2}, {"cherry", 3}, {"date", 4}, {"elderberry", 5} }; // 查找范圍內(nèi)的元素 auto itlow = myMap.lower_bound("b"); auto itup = myMap.upper_bound("d"); // 輸出找到的元素 for (auto it = itlow; it != itup; ++it) { cout << it->first << " : " << it->second << endl; } return 0; }
輸出:
banana : 2
cherry : 3
在上面的示例中,我們首先創(chuàng)建了一個(gè)map并向其中添加一些鍵值對。然后,我們使用lower_bound()和upper_bound()方法查找鍵值在范圍內(nèi)的元素。最后,我們遍歷找到的元素并輸出它們的鍵值對。
總結(jié):
在本文中,我們了解了C++中的map。map是一種關(guān)聯(lián)容器,可以快速查找給定鍵的值。我們還展示了如何創(chuàng)建和初始化map、如何在map中查找、刪除元素、遍歷map以及如何使用自定義比較器和范圍查找方法。map是C++中非常有用和高效的數(shù)據(jù)結(jié)構(gòu),值得程序員們的深入學(xué)習(xí)和掌握。
到此這篇關(guān)于C++中的map使用方法詳解的文章就介紹到這了,更多相關(guān)C++ map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言數(shù)據(jù)的存儲超詳細(xì)講解中篇練習(xí)
使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-04-04C語言進(jìn)階二叉樹的基礎(chǔ)與銷毀及層序遍歷詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對我們對C++的二叉樹基礎(chǔ)oj與二叉樹銷毀和層序遍歷進(jìn)行練習(xí),讓我們相互學(xué)習(xí),共同進(jìn)步2022-06-06C語言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Qt利用QJson實(shí)現(xiàn)解析數(shù)組的示例詳解
這篇文章主要為大家詳細(xì)介紹了Qt如何利用QJson實(shí)現(xiàn)解析數(shù)組功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,需要的小伙伴可以了解一下2022-10-10C++-操作符重載、并實(shí)現(xiàn)復(fù)數(shù)類詳解
這篇文章主要介紹了C++-操作符重載、并實(shí)現(xiàn)復(fù)數(shù)類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03