在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++项目中更加灵活地处理键值对数据。