map,unordered_map,multimap,unordered_multimap
std::map
(有序映射)std::unordered_map
(无序映射)std::multimap
(有序多重映射)std::unordered_multimap
(无序多重映射)
它们的使用方式和特点略有不同,下面分别介绍这些数据结构及其基本用法。
1. std::map
(有序映射)
std::map
是一个有序的键值对容器,键(key
)是唯一的,并且按顺序(通常是按升序)排列。
它底层是用红黑树实现的,因此查找、插入、删除的时间复杂度为 O(log n)。
特点:
- 有序性:键是有序的(按键的升序)。
- 唯一性:键是唯一的。
- 查找和插入的时间复杂度为 O(log n)。
下面是
std::map` 的基本用法介绍:
引入头文件
使用 std::map
需要引入 <map>
头文件:
#include <map>
创建 std::map
std::map
的基本语法是:
std::map<KeyType, ValueType> mapName;
例如:
std::map<int, std::string> myMap;
这将创建一个以 int
类型为键、std::string
类型为值的映射。
插入元素
- 使用
[]
操作符插入元素:
myMap[1] = "One";
myMap[2] = "Two";
- 使用
insert
函数插入元素:
myMap.insert({3, "Three"});
myMap.insert(std::make_pair(4, "Four"));
访问元素
- 使用
[]
访问元素(如果键不存在,会插入一个默认值):
std::string value = myMap[1]; // 获取键为 1 的值
- 使用
at
方法访问元素(如果键不存在,会抛出异常):
std::string value = myMap.at(2);
查找元素
- 使用
find
方法查找键是否存在,返回一个迭代器。如果键不存在,则返回map.end()
:
auto it = myMap.find(2);
if (it != myMap.end()) {
std::cout << "Key 2 found, value: " << it->second << std::endl;
} else {
std::cout << "Key 2 not found" << std::endl;
}
遍历 map
可以使用范围 for
循环或迭代器遍历 map
:
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
或者使用迭代器:
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
删除元素
- 使用
erase
删除指定键:
myMap.erase(2); // 删除键为 2 的元素
- 使用迭代器删除:
auto it = myMap.find(3);
if (it != myMap.end()) {
myMap.erase(it); // 删除键为 3 的元素
}
获取 map
的大小和检查是否为空
- 使用
size
获取map
的大小:
std::cout << "Map size: " << myMap.size() << std::endl;
- 使用
empty
检查是否为空:
if (myMap.empty()) {
std::cout << "Map is empty" << std::endl;
}
示例代码
#include <iostream>
#include <map>
int main() {
// 创建一个 map
std::map<int, std::string> myMap;
// 插入元素
myMap[1] = "One";
myMap[2] = "Two";
myMap.insert({3, "Three"});
myMap.insert(std::make_pair(4, "Four"));
// 访问元素
std::cout << "Key 1 has value: " << myMap[1] << std::endl;
std::cout << "Key 2 has value: " << myMap.at(2) << std::endl;
// 查找元素
auto it = myMap.find(3);
if (it != myMap.end()) {
std::cout << "Found key 3 with value: " << it->second << std::endl;
}
// 遍历 map
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 删除元素
myMap.erase(2);
// 显示删除后的 map
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
2. std::unordered_map
(无序映射)
std::unordered_map
是一个无序的键值对容器,键是唯一的,但它没有按顺序存储。
它使用哈希表作为底层结构,查找、插入、删除的时间复杂度为 O(1)(均摊时间)。
特点:
- 无序性:键没有特定顺序。
- 唯一性:键是唯一的。
- 查找和插入的时间复杂度在均摊情况下为 O(1)(最坏情况 O(n))。
3. std::multimap
(有序多重映射)
std::multimap
是一个有序的键值对容器,允许多个相同的键。它类似于 std::map
,但同一个键可以出现多次。
特点:
- 有序性:键是有序的。
- 非唯一性:允许键重复。
- 查找、插入的时间复杂度为 O(log n)。
4. std::unordered_multimap
(无序多重映射)
std::unordered_multimap
是一个无序的键值对容器,也允许多个相同的键。它使用哈希表存储,但允许相同的键出现多次。
特点:
- 无序性:键没有顺序。
- 非唯一性:允许键重复。
- 查找和插入的时间复杂度在均摊情况下为 O(1)(最坏情况 O(n))。
总结
std::map
:有序且唯一键,底层实现为红黑树,查找和插入 O(log n)。std::unordered_map
:无序且唯一键,底层实现为哈希表,查找和插入 O(1)(均摊)。std::multimap
:有序且允许重复键,底层为红黑树,查找和插入 O(log n)。std::unordered_multimap
:无序且允许重复键,底层为哈希表,查找和插入 O(1)(均摊)。
map,unordered_map,multimap,unordered_multimap的更多相关文章
- [STL] map,multimap,unordered_map基本用法
map的特性是,所有元素都会根据元素的键值自动被排序.map的所有元素都是pair,同时拥有键值(key)和实值(value).pair的第一元素被视为键值,第二元素被视为实值.map不允许两个元素拥 ...
- 10.1——pair,map,set,multimap,multiset
map和set只允许相同的键出现一次,而multimap和multiset则允许出现多次. 1. 引言——pair类型: pair需要添加头文件utility头文件 make_pair<v1,v ...
- Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序
写程序时,面临用Map还是unordered_map,总是很纠结,于是写了个程序进行测试 Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序 简单数据(4 Byte) 首先 ...
- 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...
- Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法
Java中List,ArrayList.Vector,map,HashTable,HashMap区别用法 标签: vectorhashmaplistjavaiteratorinteger ArrayL ...
- Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录
第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 【Map】获取字符串中,每一个字母出现的次数
package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.Tre ...
- 嵌套遍历<s:iterator>map=new TreeMap(string,Map(string,User))
//嵌套遍历,先给外层的map(假设是放在root中的,如果放在context的map中,要加#)取个别名,放到Actioncontext中 <s:iterator value="ma ...
- 哈希,哈希表,哈希Map
数组: 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难: 链表: 链表存储区间离散,占用内存比较宽松,故空间复杂 ...
随机推荐
- GraphRAG介绍
GraphRAG GraphRAG 是一种基于图的检索增强方法,由微软开发并开源.它通过结合LLM和图机器学习的技术,从非结构化的文本中提取结构化的数据,构建知识图谱,以支持问答.摘要等多种应用场景. ...
- 《Programming from the Ground Up》阅读笔记:p75-p87
<Programming from the Ground Up>学习第4天,p75-p87总结,总计13页. 一.技术总结 1.persistent data p75, Data whic ...
- python selenium 判断元素是否存在,实现:找到元素,执行对应的代码;找不到元素,继续执行其他代码
selenium因为找不到元素会抛出异常,导致执行结束 可以考虑使用driver.find_elements(),找不到元素时就会返回空列表,使用if-else语句,判断列表是否为空,非空,则正常找到 ...
- LangChain的LCEL和Runnable你搞懂了吗
LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough.RunnableParallel.RunnableBranch.RunnableLambda ...
- Vue打包部署到CentOS 7
项目打包 在项目目录下执行打包目录进行打包 yarn build // 或者 npm run build 打包完成后会生成一个dist文件夹,这样就打包完成了(我这样做了SEO的,所有目录结构有点不一 ...
- 【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究
本文,我们将一起探讨探讨,如下所示的一个卡片 Hover 动画,应该如何实现: 这个效果的几个难点: 鼠标移动的过程中,展示当前卡片边缘的 border 以及发光效果: 效果只出现在鼠标附近?这一块的 ...
- 组长:你熟悉过React,开发个Next项目模板吧,我:怎么扯上关系的?
组长:你熟悉过React,开发个Next项目模板吧,我:怎么扯上关系的? 最近工作安排我开发一个Next.js项目模板,心里默笑,React用得少得都快忘光了,现在得搞Next?虽然我曾是React的 ...
- C程序起点main函数
C程序起点main函数 main c语言中main函数接收两个参数int argc, char* argv[] int main(int argc, char* argv[]); int main(i ...
- visual studio安装MFC模板
计算机图形学 奇怪的重点 需要单击选中使用C++的桌面开发 才会跳出右侧的选项 要么就是展开右侧的收缩
- [kernel] 带着问题看源码 —— 脚本是如何被 execve 调用的
前言 在<[apue] 进程控制那些事儿>一文的"进程创建-> exec -> 解释器文件"一节中,曾提到脚本文件的识别是由内核作为 exec 系统调用处理 ...