現代C++中的多映射(std::multimap)是什么?
在C++的標準模板庫(STL)中,std::multimap是一個關聯容器,它允許存儲多個具有相同鍵(key)的元素。與std::map不同,std::map中的每個鍵必須是唯一的,而std::multimap則沒有這個限制。這使得std::multimap在某些特定場景下非常有用,比如需要存儲多個值與同一個鍵相關聯的情況。
std::multimap的基本概念
(1) 定義
std::multimap是一個模板類,它存儲的元素是鍵值對(key-value pairs),其中鍵不需要唯一。這些元素根據鍵自動排序。std::multimap允許你高效地基于鍵檢索、插入和刪除元素。
(2) 特性
- 自動排序:std::multimap中的元素根據其鍵自動排序。你可以使用比較函數來自定義排序規則。
- 非唯一鍵:與std::map不同,std::multimap允許存儲具有相同鍵的多個元素。
- 動態大小:std::multimap是一個動態容器,可以在運行時添加和刪除元素。
- 高效的查找操作:由于元素是排序的,所以基于鍵的查找操作非常高效,通常具有對數時間復雜度。
使用std::multimap
(1) 包含頭文件
要使用std::multimap,你需要包含<map>頭文件:
#include <map>
(2) 創建和初始化
你可以使用不同的方法來創建和初始化std::multimap:
// 創建一個空的multimap
std::multimap<int, std::string> mmap;
// 在創建時初始化multimap
std::multimap<int, std::string> mmap = {{1, "apple"}, {2, "banana"}, {1, "cherry"}};
// 使用insert函數添加元素
mmap.insert({3, "date"});
mmap.insert(std::pair<int, std::string>(4, "elderberry"));
(3) 訪問元素
你可以使用迭代器或范圍基礎的for循環來訪問std::multimap中的元素:
for (const auto& pair : mmap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 使用迭代器
for (auto it = mmap.begin(); it != mmap.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
(4) 查找元素
你可以使用find、lower_bound和upper_bound等成員函數來查找元素:
auto it = mmap.find(1); // 查找鍵為1的第一個元素
if (it != mmap.end()) {
std::cout << "Found: " << it->second << std::endl;
}
// 查找鍵為1的所有元素
auto range = mmap.equal_range(1);
for (auto it = range.first; it != range.second; ++it) {
std::cout << it->second << std::endl;
}
(5) 刪除元素
你可以使用erase成員函數來刪除元素:
// 通過迭代器刪除元素
auto it = mmap.find(2);
if (it != mmap.end()) {
mmap.erase(it); // 刪除單個元素
}
// 刪除所有鍵為1的元素
auto range = mmap.equal_range(1);
mmap.erase(range.first, range.second); // 刪除范圍內的所有元素
總結
std::multimap是C++中一個非常有用的關聯容器,它允許你存儲多個具有相同鍵的元素。通過了解std::multimap的基本概念和使用方法,你可以在你的C++項目中更加靈活地處理鍵值對數據。