现代C 中的多映射(std::multimap)是什么?
创始人
2025-07-13 03:51:25
0

在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,你需要包含头文件:

#include 

(2) 创建和初始化

你可以使用不同的方法来创建和初始化std::multimap:

// 创建一个空的multimap  
std::multimap mmap;  
  
// 在创建时初始化multimap  
std::multimap mmap = {{1, "apple"}, {2, "banana"}, {1, "cherry"}};  
  
// 使用insert函数添加元素  
mmap.insert({3, "date"});  
mmap.insert(std::pair(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++项目中更加灵活地处理键值对数据。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...