1. std::map(有序映射)
  2. std::unordered_map(无序映射)
  3. std::multimap(有序多重映射)
  4. 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的更多相关文章

  1. [STL] map,multimap,unordered_map基本用法

    map的特性是,所有元素都会根据元素的键值自动被排序.map的所有元素都是pair,同时拥有键值(key)和实值(value).pair的第一元素被视为键值,第二元素被视为实值.map不允许两个元素拥 ...

  2. 10.1——pair,map,set,multimap,multiset

    map和set只允许相同的键出现一次,而multimap和multiset则允许出现多次. 1. 引言——pair类型: pair需要添加头文件utility头文件 make_pair<v1,v ...

  3. Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序

    写程序时,面临用Map还是unordered_map,总是很纠结,于是写了个程序进行测试 Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序 简单数据(4 Byte) 首先 ...

  4. 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...

  5. Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法

    Java中List,ArrayList.Vector,map,HashTable,HashMap区别用法 标签: vectorhashmaplistjavaiteratorinteger ArrayL ...

  6. Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  7. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. 【Map】获取字符串中,每一个字母出现的次数

    package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.Tre ...

  9. 嵌套遍历<s:iterator>map=new TreeMap(string,Map(string,User))

    //嵌套遍历,先给外层的map(假设是放在root中的,如果放在context的map中,要加#)取个别名,放到Actioncontext中 <s:iterator value="ma ...

  10. 哈希,哈希表,哈希Map

    数组: 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难: 链表: 链表存储区间离散,占用内存比较宽松,故空间复杂 ...

随机推荐

  1. Microsoft Dynamics CRM 插件被限制2分钟超时解决方案

    背景: 在隔离模式"沙箱"中运行的插件或自定义工作流活动将有2分钟的硬限制.如果你的插件很复杂,需要超过2分钟,有一些解决方法. CRM on premise (本地版) 选择插件 ...

  2. 基于EasyTcp4Net开发一个功能较为完善的去持久化聊天软件

    之前自己写了一篇介绍TCP的一些常用的功能介绍和特征,并且用代码做了示例,最终开发了一个EasyTcp4Net的TCP工具库,其最大的特色就是使用了微软提供的高性能库中的一些数据结构来处理TCP数据. ...

  3. os.popen(cmd) 与 os.system(cmd) 的区别

    os.popen(cmd) 与 os.system(cmd) 的区别 1,os.popen(cmd) 不会直接返回任何数据,os.system(cmd) 会直接输出结果(返回的却是int状态码) 2, ...

  4. web3 产品介绍: safe --多签钱包 多人审批更放心

    Safe是一款由Gnosis团队开发的多签钱包,它提供了一种安全.灵活和易于使用的方式来管理加密资产.在本文中,我们将介绍Safe的主要特点以及如何使用Safe来保护您的数字资产. 一.Safe的特点 ...

  5. javaDoc生成方式

    命令行生成 在cmd控制台窗口上找到需要生成文件的路径,然后执行命令. # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding U ...

  6. 编程语言中的Variable Shadowing(变量遮蔽)—— declaration shadows a local variable —— Consider Allow Shadowing of let Bindings

    Variable Shadowing(变量遮蔽)是编程语言中比较常见的一种情况,但是由于不同语言对于这个情景的处理是不同的,所以在具体语言中这个Variable Shadowing(变量遮蔽)的表现也 ...

  7. 支持NVIDIA GPU —— 如何运行docker环境下的Jax环境

    项目地址: https://github.com/NVIDIA/JAX-Toolbox 具体的安装命令: 地址: https://github.com/NVIDIA/JAX-Toolbox/pkgs/ ...

  8. 从baselines库的common/vec_env/vec_normalize.py模块看方差的近似计算方法

    在baselines库的common/vec_env/vec_normalize.py中计算方差的调用方法为: RunningMeanStd 同时该计算函数的解释也一并给出了: https://en. ...

  9. inline,static inline

    https://blog.csdn.net/A_BCDEF_/article/details/89485894 inline 函数被调用时,需要出栈入栈.当函数频繁被调用时,则不断地有函数出栈入栈,会 ...

  10. C#自己封装数据库操作类BaseADO

    这几天学习数据库操作,就自己封装了一个数据库操作类,下面是代码展示 下面的例子是Access数据库 也可能用在Sql数据库中,只在在第一行代码上修改标识符即可 #define OLEDB_ using ...