现代C++中的多映射(std::multimap)是什么?

开发 前端
通过了解std::multimap的基本概念和使用方法,你可以在你的C++项目中更加灵活地处理键值对数据。

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

责任编辑:赵宁宁 来源: 鲨鱼编程
相关推荐

2023-10-04 00:38:30

C++原子

2023-12-13 10:08:59

C++原子代码

2023-10-25 13:27:20

C++字符串

2016-10-20 16:07:11

C++Modern C++异步

2023-12-06 13:19:00

C++数学函数

2023-11-13 22:30:16

C++开发

2022-09-21 13:53:15

C++移动语义

2022-09-19 08:12:47

编译器程序函数

2023-09-26 22:37:16

C++const

2010-02-05 14:51:48

C++托管

2010-01-14 17:13:53

C++接口

2010-01-21 09:34:57

C++语法

2010-01-27 16:05:06

C++堆栈

2023-08-02 08:40:38

C++代码宏定义

2010-01-21 14:07:14

CC++声明

2023-11-24 16:13:05

C++编程

2024-04-29 07:48:04

C++FinalOverride

2010-02-06 09:46:46

C++单向链表

2010-01-20 10:19:55

C++数组

2010-01-21 13:33:44

C++基类
点赞
收藏

51CTO技术栈公众号