multimap
是 C++ STL (Standard Template Library) 中的一种关联容器,类似于 map
,但它允许存储具有相同键的多个值。每个键值对(key-value pair)中的键在 multimap
中可以重复出现,而值则可以不同。multimap
中的键值对也是根据键的值进行排序的,默认为升序。multimap
的内部实现通常为红黑树,因此它提供了高效的插入、删除和查找操作。
主要特点
- 允许重复键:
multimap
容器允许存储具有相同键的多个值。 - 排序:键值对根据键的值进行排序,默认为升序。
- 高效查找:插入、删除和查找操作的时间复杂度均为 O(log n)。
- 双向迭代器:可以使用双向迭代器来遍历
multimap
容器中的元素。
常用操作
定义和初始化
#include <map>std::multimap<std::string, int> mm; // 创建一个空的 multimap 容器
std::multimap<std::string, int> mm = {{"apple", 1}, {"apple", 2}, {"banana", 3}}; // 初始化 multimap 容器
插入元素
mm.insert({"apple", 3}); // 插入键值对
mm.insert(std::make_pair("banana", 4)); // 插入键值对
mm.emplace("orange", 5); // 插入键值对(C++11 及以上版本)
删除元素
mm.erase("apple"); // 删除键为 "apple" 的所有键值对
mm.erase(mm.begin()); // 删除第一个键值对
查找元素
auto range = mm.equal_range("apple"); // 查找键为 "apple" 的所有键值对,返回一个范围 [first, last)
for (auto it = range.first; it != range.last; ++it) {std::cout << it->first << ": " << it->second << std::endl;
}auto it = mm.find("banana"); // 查找键为 "banana" 的一个键值对,返回指向该键值对的迭代器,如果找不到则返回 end()
if (it != mm.end()) {std::cout << "Found " << it->first << ": " << it->second << std::endl;
} else {std::cout << "Not found" << std::endl;
}
计算特定键的元素数量
size_t count = mm.count("apple"); // 计算键为 "apple" 的键值对数量
std::cout << "There are " << count << " elements with key 'apple'." << std::endl;
获取元素数量
std::cout << "The multimap has " << mm.size() << " key-value pairs." << std::endl;
清空容器
mm.clear(); // 清空 multimap 容器
遍历容器
for (const auto& pair : mm) {std::cout << pair.first << ": " << pair.second << std::endl;
}
// 或者使用迭代器
for (auto it = mm.begin(); it != mm.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;
}
自定义比较函数
如果你想改变 multimap
中键的排序方式,可以提供一个自定义的比较函数或对象。例如,如果你想要创建一个键按降序排序的 multimap
,你可以这样做:
#include <map>
#include <functional>std::multimap<std::string, int, std::greater<std::string>> descendingMultimap; // 创建一个键按降序排序的 multimap
或者使用自定义的比较类:
struct CustomCompare {bool operator()(const std::string& a, const std::string& b) const {return a > b; // 降序排序}
};std::multimap<std::string, int, CustomCompare> customMultimap;
总结
multimap
是一个非常有用的数据结构,当你需要存储具有相同键的多个值,并且希望这些键值对是有序的时,它是一个很好的选择。由于它的内部实现,multimap
提供了高效的插入、删除和查找操作。multimap
在许多应用场景中都非常有用,例如多值映射、数据库索引等。