C++ STL 之关联容器 map 详解

news2025/1/21 18:49:50

文章目录

  • Part.I Attention
    • Chap.I 注意事项
    • Chap.II 操作技巧
  • Part.II Funciton
  • Part.III Code
    • Chap.I map
    • Chap.II unordered_map
    • Chap.III multimap

Part.I Attention

C++ 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值(Value)。

Chap.I 注意事项

使用map需要注意的地方:

  • 加引用#include <map>
  • 头文件map中除了有map,还有multimap;另外头文件unordered_map中也有相似的容器unordered_map, unordered_multimap,它们之间的区别如下:
名称含义
map在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容;键值key和value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名为pair;map中的key是唯一的,并且不能修改,遇到重复的key就会插入失败;但可以利用operator[]对value进行修改;map的底层实现为红黑树,查找效率比较高,是O(logN);
multimap与map的区别在于:multimap中的key可以重复;multimap中没有重载operator[]功能;对于重复的元素,查找的时候也是返回中序遍历的第一个元素。
unordered_map存储键值对 <key, value> 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。
unordered_multimap和 unordered_map 唯一的区别在于,该容器允许存储多个键相同的键值对。
  • 最基本的构造函数示例:std::map<int, std::string> mapPerson;
  • map中的元素是按照一定顺序存储的,默认是按键(key)升序排列的;
map<T1, T2> m;	//默认按键的升序方式排列元素,相当于 map<T1, T2, less<T1>> m
map<T1, T2, less<T1>> m; //该容器是按键的升序方式排列元素。
map<T1, T2, greater<T1>> m;  //该容器是按键的降序方式排列元素。

Chap.II 操作技巧

下面是一些操作示例:

// 用insert函數插入pair
mapStudent.insert(make_pair(000, "student_zero"));
// 用insert函數插入pair
mapStudent.insert({000, "student_zero"});
// 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
// 用"array"方式插入
mapStudent[123] = "student_first";
// 查找元素,没找到就返回 end
mapStudent.find("123")!=mapStudent.end()
// 根据键值删除元素,如果删除成功返回1,否则返回0
mapStudent.erase("123");
// 清空整个 map
mapStudent.erase(mapStudent.begin(), mapStudent.end());

Part.II Funciton

这里仅仅介绍map的函数(其他三种map的函数和它大差不差,有些少一些函数或者多那么几个函数),如下图:

在这里插入图片描述

函数含义
begin()返回指向 map 头部的迭代器(注意是排好序的)
clear()删除所有元素
count(key)返回键key出现的次数,map中此函数返回的最大值为1
empty()如果 map 为空则返回 true
emplace()在当前 map 容器中的指定位置处构造新键值对。其效果和插入键值对一样,但效率更高。
end()返回指向 map 末尾的迭代器,注意它可不是最后一个元素,而是容器的末尾,类似于char[]类型中的'\0'
equal_range()该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.firstlower_bound() 方法的返回值等价,pair.secondupper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对(map 容器键值对唯一,因此该范围最多包含一个键值对)。
erase()删除 map 容器指定位置、指定键(key)值或者指定区域内的键值对。
find(key)在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。
get_allocator()返回map的配置器,比如map<string, int>::allocator_type
insert()插入元素
key_comp()返回比较元素key的函数
lower_bound(key)返回一个指向当前 map 容器中第一个大于或等于 key 的键值对的双向迭代器
max_size()返回可以容纳的最大元素个数
rbegin()返回一个指向map尾部的逆向迭代器
rend()返回一个指向map头部的逆向迭代器
size()返回map中元素的个数
swap()交换两个map
upper_bound(key)返回一个指向当前 map 容器中第一个大于 key 的键值对的迭代器。
value_comp()返回比较元素 value 的函数

Part.III Code

Chap.I map

测试代码如下:

#include <iostream>
#include <iomanip>
#include <map>

using namespace std;

int main()
{
    map<string,int> data {{"Tom",10},{"Jerry",20}};
    // map<string,int> data {make_pair("Tom",10),make_pair("Jerry",20)}    // the same as above
    auto tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    data["Allice"]=30;
    data.insert({"Tony",10});
    cout<<data["Tony"] << endl;
    data.insert({"Tony",20}); // it can't work, data["Tony"]=20; is OK!
    cout<<data["Tony"] << endl;
    tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    cout<<data.size() << setw(15)<<data.max_size()<<endl;
    for(auto itr=data.rbegin();itr!=data.rend();itr++)
        cout<< itr->first<<" " <<itr->second<< endl;
    getchar();
    return 0;
}

输出如下:

Jerry 20
10
10
Allice 30
4       97612893
Tony 10
Tom 10
Jerry 20
Allice 30

Chap.II unordered_map

测试代码如下:

#include <iostream>
#include <iomanip>
#include <unordered_map>

using namespace std;

int main()
{
    unordered_map<string,int> data {{"Tom",10},{"Jerry",20}};
    // map<string,int> data {make_pair("Tom",10),make_pair("Jerry",20)}    // the same as above
    auto tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    data["Allice"]=30;
    data.insert({"Tony",10});
    cout<<data["Tony"] << endl;
    data.insert({"Tony",20}); // it can't work, data["Tony"]=20; is OK!
    cout<<data["Tony"] << endl;
    tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    cout<<data.size() << setw(15)<<data.max_size()<<endl;
    for(auto itr=data.begin();itr!=data.end();itr++)
        cout<< itr->first<<" " <<itr->second<< endl;
    getchar();
    return 0;
}

输出如下:

Jerry 20
10
10
Tony 10
4      119304647
Tony 10
Allice 30
Jerry 20
Tom 10

Chap.III multimap

测试代码如下:

#include <iostream>
#include <iomanip>
#include <map>

using namespace std;

int main()
{
    multimap<string,int> data {{"Tom",10},{"Jerry",20}};
    // map<string,int> data {make_pair("Tom",10),make_pair("Jerry",20)}    // the same as above
    auto tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    data.insert({"Allice",30});
    data.insert({"Tony",10});
    auto ret=data.equal_range("Tony");
    for(auto itr=ret.first;itr!=ret.second;itr++)
        cout<<itr->second<< " ";
    cout << endl;
    data.insert({"Tony",20}); // it work! data["Tony"]=20; is Error!
    ret=data.equal_range("Tony");
    for(auto itr=ret.first;itr!=ret.second;itr++)
        cout<<itr->second<< " ";
    cout << endl;
    tmp=data.begin();
    cout<< tmp->first << " " << tmp->second<<endl;
    cout<<data.size() << setw(15)<<data.max_size()<<endl;
    for(auto itr=data.begin();itr!=data.end();itr++)
        cout<< itr->first<<" " <<itr->second<< endl;
    getchar();
    return 0;
}

输出如下:

Jerry 20
10
10 20
Allice 30
5       97612893
Allice 30
Jerry 20
Tom 10
Tony 10
Tony 20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博苑股份冲刺创业板上市:上半年净利润约1亿元,李成林为董事长

近日&#xff0c;山东博苑医药化学股份有限公司&#xff08;下称“博苑股份”或“博苑医药”&#xff09;在深圳证券交易所创业板更新招股书。据贝多财经了解&#xff0c;博苑股份于2022年6月17日递交招股书&#xff0c;准备在创业板上市。 本次冲刺创业板上市&#xff0c;博苑…

服务的消费方式和服务熔断

目录 1. 服务消费方式 1.1 RestTemplate 1.2 feign 2. 服务熔断&#xff08;降级&#xff09; 2.1 在微服务架构中服务熔断的必要性 健康的微服务集群&#xff1a; ​编辑 出现故障&#xff1a; ​编辑 系统雪崩&#xff1a; ​编辑 2.2 hystrix 2.3 hystrix的使用…

[Linux]多线程的同步和互斥(线程安全 | 互斥锁 | 死锁 | 条件变量)

文章目录Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口初始化互斥量销毁互斥量互斥量的加锁和解锁互斥量实现原理可重入vs线程安全常见线程不安全情况常见线程安全的情况常见不可重入的情况常见可重入的情况可重入与线程安全的联系可重入与线程安全的区别…

你易忽略的三极管电路问题1:下拉电阻

如下这个三极管共射极驱动电路中&#xff0c;B、E极之间的下拉电阻的作用&#xff1f;是否可以将其去除&#xff1f;该电阻有两个重要的作用&#xff1a;在驱动信号关闭时给三极管基极一个固定的电平。当驱动信号&#xff08;SIGNAL&#xff09;关闭时&#xff0c;若没有下拉电…

搭建Python环境(~保姆级别服务~)

文章目录前言一、搭建 Python 环境安装Python1. 找到官方网站2. 找到下载页面3. 双击安装包4. 运行 hello world安装PyCharm1. 找到官方网站2. 找到下载页面3. 双击安装包4. 运行 hello world创建一个项目选择项目所在的位置, 并选择使用的 Python 解释器.创建文件4. 编写代码5…

emoji与UTF-16、UCS-4、unicode的关系、原理和换算

emoji与UTF-16、UCS-4、unicode的关系、原理和换算 目录 emoji与UTF-16、UCS-4、unicode的关系、原理和换算 一、Unicode字符集概述 二、原理 1、UTF-16、UCS-4、unicode 2、emoji表情字符标准 3、关于肤色 一、Unicode字符集概述 https://en.wikipedia.org/wiki/Emoj…

【Python机器学习】标注任务与序列问题讲解(图文解释)

标注模型用于处理有前后关联关系的序列问题。在预测时&#xff0c;它的输入是一个观测序列&#xff0c;该观测序列的元素一般具有前后的关联关系。它的输出是一个标签序列&#xff0c;也就是说&#xff0c;标注模型的输出是一个向量&#xff0c;该向量的每个元素是一个标签&…

VScode ChatGPT 的中文插件安装使用

ChatGPT 的中文插件 由于官方服务对服务的封禁&#xff0c;大量国内代理服务全军覆没。开发者经过千辛万苦&#xff0c;找到了一个beta模型&#xff0c;目前作为 ChatGPT 正式服务上线前的过渡方案&#xff0c;供大家使用 插件安装后即处于”国内模式“&#xff0c;国内模式开…

艾美捷Annexin V-FITC凋亡检测试剂盒流式细胞术方案

FITC标记的重组人膜联蛋白V显示亮绿色荧光&#xff08;Ex&#xff08;max&#xff09;:488nm&#xff0c;Em&#xff08;max&#xff09;:530nm&#xff09;。 艾美捷Annexin V-FITC凋亡检测试剂盒化学性质&#xff1a; 应用&#xff1a;流式细胞术、荧光显微镜、荧光检测 应…

LncFinder | 非编码RNA的识别与分析神器!!!~

1写在前面 非编码RNA(ncRNAs), 是指不编码蛋白质的RNA。&#x1f617; 其中包括rRNA&#xff0c;tRNA&#xff0c;snRNA&#xff0c;snoRNA, lncRNA和miRNA等多种已知功能的RNA&#xff0c;还包括未知功能的RNA。&#x1f913; 长链非编码RNA&#xff08;lncRNA&#xff09;指的…

35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

机器学习100天(十六):016 逻辑回归损失函数

机器学习 100 天,今天讲的是:逻辑回归损失函数。 一、如何找到最佳分类直线 讲完了逻辑回归基本原理之后,我们再来思考一个非常关键的问题:就是如何找到最佳的分类直线呢? 如图中所示,如何判断这三条直线哪个更好?线性回归里,我们可以用均方误差作为损失函数,选择均…

非零基础自学Golang 第14章 反射 14.4 反射三定律

非零基础自学Golang 文章目录非零基础自学Golang第14章 反射14.4 反射三定律14.4.1 接口到反射类型的转换14.4.2 反射到接口类型的转换14.4.3 修改反射类型对象第14章 反射 14.4 反射三定律 在使用反射时&#xff0c;牢记这三条定律会让你对反射有更加清晰的认识。 14.4.1 接…

网络攻防中如何在海量虚假IP中找到目标服务或者设备的真实IP地址

网络攻防中如何在海量虚假IP中找到目标服务或者设备的真实IP地址。 Fav-up是一款功能强大的IP查询工具,该工具可以通过Shodan和Favicon(网站图标)来帮助研究人员查询目标服务或设备的真实IP地址。 工具安装 首先,该工具需要本地设备安装并部署好Python 3环境。然后广大研究…

5 | 如何更换证书

目录1 操作场景2 操作类型2.1 更换自有证书2.2 腾讯云托管证书2.3 一键替换证书3 结果校验1 操作场景 如果证书已过期&#xff0c;用户在浏览网站的时候会显示证书不可信&#xff1b; 2 操作类型 2.1 更换自有证书 登录 Web 应用防火墙控制台&#xff0c;在左侧导航中&…

load_ext是干什么的(autotime,autoreload)

文章目录load_extautotimeautoreload声明&#xff1a;本文都是自己的理解。 load_ext load_ext是jupyter notebook中的一个命令&#xff0c;而jupyter notebook和Ipython几乎可以等同。那load_ext作用是什么呢&#xff1f;我感觉作用就是类似于import。 load_extload extenst…

单片机AT89C51六位数码管秒表

详细代码讨论加我QQ&#xff1a;1271370903 1.1设计目的 本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理&#xff0c;结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来&#xff0c;使得系统能够实…

【Unity大气渲染】关于单次大气散射的理论知识

参考 最近在实现程序化天空盒&#xff0c;到了实现大气散射这一步&#xff0c;索性查漏补缺&#xff0c;把大气散射这块儿的理论知识补充明白了。跟着【实战】从零实现一套完整单次大气散射_一的推荐&#xff0c;学习这块我直接从Volumetric Atmospheric Scattering啃起。 补…

平安夜,愿大家平安健康!

12月24日平安夜(Christmas Eve)&#xff0c;是圣诞节前夕的晚上&#xff0c;寓意着耶稣诞生的夜晚会给世人带来平安幸福。 据《圣经》记载&#xff0c;耶稣诞生的那一晚&#xff0c;在旷野看守羊群的牧羊人&#xff0c;突然听见有声音自天上传来&#xff0c;向他们报耶稣降生的…

华为云桌面能为设计行业提供哪些“黑科技”?

华为云桌面能为设计行业提供哪些“黑科技”&#xff1f; 如今&#xff0c;传统设计模式中的软硬件更新迭代成本高、团队协作低效、资产利用率低和上下游进步不同步等缺陷日益显露&#xff0c;已经不能适应市场需求。华为云桌面携手赞奇科技打造出一个全方位的一站式云上内容制作…