【C++关联容器】map的成员函数

news/2024/4/26 1:34:18/文章来源:https://blog.csdn.net/Qiuhan_909/article/details/130364286

目录

map

1. 构造、析构和赋值运算符重载

1.1 构造函数

1.2 析构函数

1.3 赋值运算符重载

2. 迭代器

3. 容量

4. 元素访问

5. 修改器

6. 观察者

7. 操作

8. 分配器


map

map是关联容器,它按照特定的顺序存储由关键字值和映射值的组合形成的元素。

在一个map中,关键字值通常用于排序和唯一识别元素,而映射值则存储与此键相关的内容。关键字值和映射值的类型可能不同,在成员类型value_type中被组合在一起,它是一个结合了两者的pair类型:

typedef pair<const Key, T> value_type;

在内部,map中的元素总是按照它的关键字进行排序,遵循一个特定的严格的弱排序标准,由其内部的比较对象(类型为Compare)指示。

map容器通常比unordered_map容器按关键字访问单个元素的速度要慢,但是它们允许根据顺序直接迭代子集。

map中的映射值可以使用括号操作符(operator[])直接通过其相应的关键字来访问。

map通常被实现为二叉搜索树。

使用map类型要包含map头文件;map定义在命名空间std中。

1. 构造、析构和赋值运算符重载

1.1 构造函数

重载函数功能
empty构造空的map类对象
range用迭代器区间[first,last)中的元素构造

copy

构造一个x的拷贝
move移动构造函数
initializer list用初始化列表来构造
#include <iostream>
#include <map>
using namespace std;int main()
{map<char, int> m1;//emptyfor (auto e : m1){cout << e.first << " " << e.second << endl;}//空//插入m1.insert({ 'g', 30 });m1.insert(make_pair('a', 10));m1.insert(pair<char, int>('f', 50));m1['b'];m1['d'] = 20;for (auto e : m1){cout << e.first << " " << e.second << endl;}//a 10//b 0//d 20//f 50//g 30map<char, int> m2(++m1.begin(), m1.end());//rangefor (auto e : m2){cout << e.first << " " << e.second << endl;}//b 0//d 20//f 50//g 30map<char, int> m3(m2);//copy//等价于map<char, int> m3 = m2;for (auto e : m3){cout << e.first << " " << e.second << endl;}//b 0//d 20//f 50//g 30map<string, string> m4{ {"empty","空"},{"range", "范围"},{"copy", "复制"} };//等价于map<string, string> m4 = { {"empty","空"},{"range", "范围"},{"copy", "复制"} };for (auto e : m4){cout << e.first << " " << e.second << endl;}//copy 复制//empty 空//range 范围return 0;
}

1.2 析构函数

1.3 赋值运算符重载

2. 迭代器

函数功能

begin

&

end

begin返回一个迭代器,指向map对象的第一个元素

end返回一个迭代器,指向map对象的最后一个元素的下一个位置

rbegin

&

rend

rbegin返回一个反向迭代器,指向map对象的最后一个元素

rend返回一个反向迭代器,指向map对象的第一个元素的上一个位置

cbegin

&

cend

cbegin返回一个const迭代器,指向map对象的第一个元素

cend返回一个const迭代器,指向map对象的最后一个元素的下一个位置

crbegin

&

crend

crbegin返回一个const反向迭代器,指向map对象的最后一个元素

crend返回一个const反向迭代器,指向map对象的第一个元素的上一个位置

begin&end和rbegin&rend返回的迭代器指向:

const_iterator是一个指向const内容的迭代器。迭代器本身可以修改,但是它不能被用来修改它所指向的内容。

begin&end/rbegin&rend和cbegin&cend/crbegin&crend的不同:

  • begin&end/rbegin&rend的返回类型由对象是否是常量来决定。如果不是常量,返回iterator;如果是常量,返回const_iterator。
  • cbegin&cend/crbegin&crend的返回类型是const_iterator,不管对象本身是否是常量。
#include <iostream>
#include <map>
using namespace std;int main()
{map<string, string> m{ {"iterator", "迭代器"},{"begin","开始"},{"end", "结束"} };map<string, string>::iterator it = m.begin();while (it != m.end()){cout << it->first << " " << it->second << endl;//等价于cout << (*it).first << " " << (*it).second << endl;++it;}//begin 开始//end 结束//iterator 迭代器auto rit = m.rbegin();//map<string, string>::reverse_iterator rit = m.rbegin();while (rit != m.rend()){cout << rit->first << " " << rit->second << endl;//等价于cout << (*rit).first << " " << (*rit).second << endl;++rit;}//iterator 迭代器//end 结束//begin 开始return 0;
}

3. 容量

函数功能
empty检测set是否为空,是返回true,否则返回false
size

返回set的元素个数

max_size返回set所能容纳的最大元素数
#include <iostream>
#include <map>
using namespace std;int main()
{map<string, string> m{ {"iterator", "迭代器"},{"begin","开始"},{"end", "结束"} };if (m.empty())cout << "map为空" << endl;elsecout << "map不为空" << endl;//map不为空cout << m.size() << endl;//3cout << m.max_size() << endl;//59652323return 0;
}

4. 元素访问

函数功能
operator[]

如果k与某个元素的关键字相匹配,返回对其映射值的引用

如果k与任何元素的关键字不匹配,插入一个关键字为k的新元素,并返回对其映射值的引用

at

返回vector中n位置的元素的引用

有越界检查,如果越界会抛异常

#include <iostream>
#include <map>
using namespace std;int main()
{map<char, int> m;m['b'];     //插入一个关键字为'b'的元素,但没有对映射值进行初始化m['d'] = 20;//插入一个关键字为'd'的元素,并将映射值初始化为20	cout << "m['b'] = " << m['b'] << endl;//m['b'] = 0cout << "m['d'] = " << m['d'] << endl;//m['d'] = 20m['b'] = 50;//修改关键字为'b'的元素的映射值为50cout << "m['b'] = " << m['b'] << endl;//m['b'] = 50cout << "m['d'] = " << m['d'] << endl;//m['d'] = 20return 0;
}

5. 修改器

函数功能
insert插入元素
erase删除元素
swap交换内容
clear清空内容
emplace构建和插入元素
emplace_hint构建和插入带有提示的元素
#include <iostream>
#include <map>
using namespace std;int main()
{map<char, int> m1;m1.insert(make_pair('p', 10));m1.insert(pair<char, int>('f', 50));m1.insert({ 'g', 30 });for (auto e : m1){cout << e.first << " " << e.second << endl;}//f 50//g 30//p 10m1.erase(--m1.end());m1.erase('g');for (auto e : m1){cout << e.first << " " << e.second << endl;}//f 50map<char, int> m2{ {'h', 90},{'d',40},{'a',20} };m1.swap(m2);for (auto e : m1){cout << e.first << " " << e.second << endl;}//a 20//d 40//h 90m1.clear();if (m1.empty())cout << "m1被清空" << endl;elsecout << "m1没被清空" << endl;//m1被清空return 0;
}

6. 观察者

函数功能
key_comp返回比较对象
value_comp返回比较对象

7. 操作

函数功能
find获取元素的迭代器
count

计算特定元素的数量

返回值0或1

lower_bound返回指向下限的迭代器
upper_bound返回指向上限的迭代器
equal_range

获取相等元素的范围

范围内有0或1个元素

#include <iostream>
#include <map>
using namespace std;int main()
{map<char, int> m;m.insert({ 'g', 30 });m.insert(make_pair('a', 10));m.insert(pair<char, int>('f', 50));m['b'];m['d'] = 20;auto it = m.find('f');if (it != m.end()){cout << "f在map中" << endl;}else{cout << "f不在map中" << endl;}//f在map中it = m.find('h');if (it != m.end()){cout << "h在map中" << endl;}else{cout << "h不在map中" << endl;}//h不在map中if (m.count('a')){cout << "a在map中" << endl;}else{cout << "a不在map中" << endl;}//a在map中if (m.count('c')){cout << "c在map中" << endl;}else{cout << "c不在map中" << endl;}//c不在map中return 0;
}

8. 分配器

函数功能
get_allocator获取分配器

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Springboot系列】项目启动时怎么给mongo表加自动过期索引

1、前言 在之前操作mongo的过程中&#xff0c;都是自动创建&#xff0c;几乎没有手动创建过表。 这次开发中有张表数据量大&#xff0c;并且不是特别重要&#xff0c;数据表维护一个常见的问题是过期数据没有被及时清理&#xff0c;导致数据量过大&#xff0c;查询变得缓慢。…

LeetCode-242. 有效的字母异位词

题目链接 LeetCode-242. 有效的字母异位词 题目描述 题解 题解一&#xff08;Java&#xff09; 作者&#xff1a;仲景 首先&#xff0c;满足条件的情况下&#xff0c;两个字符串的长度一定是相等的&#xff0c;不相等一定不满足条件 使用Hash表来存储字符串s中各个字符出现的…

Spring Security实战(九)—— 使用Spring Security OAuth实现OAuth对接

一、OAuth2.0介绍 OAuth2.0是一种授权协议&#xff0c;允许用户授权第三方应用程序代表他们获取受保护的资源&#xff0c;如个人信息或照片等。它允许用户授权访问他们存储在另一个服务提供商上的资源&#xff0c;而无需将其凭据共享给第三方应用程序。OAuth2.0协议建立在OAuth…

【具体到每一步】从0制作一个uniapp的新闻类页面(界面篇)

目录 项目初始化 / 基础配置 项目创建 配置路由/页面/tabbar pages.json配置tabbar 配置图标/静态资源 导航栏和字体颜色 scroll-view实现横向滚动条样式 公共模块定义components组件 新建组件 使用组件 组件里的结构 布局个人中心页面 组件差异化处理 数据传递 导航…

DevExpress:报表在winform窗体上显示(使用documentViewer控件)

一&#xff1a;控件认识 documentViewer&#xff08;版本DX22.2&#xff09;,老版本中的可能是printControl&#xff08;工具箱面板中可能找不到&#xff09;&#xff0c;通过官网搜索发现&#xff0c;这个控件现在继承于documentViewer这个控件。因此&#xff0c;使用documen…

Unity入门(一)

Unity Unity是一套完善体系与编辑器的跨平台游戏开发工具&#xff0c;也可以称之为游戏引擎。游戏引擎是指一些编写好的可以重复利用的代码与开发游戏所用的各功能编辑器。 基于C#编程&#xff0c;易上手&#xff0c;高安全性独特的面向组件游戏开发思想让游戏开发更加简单易…

【神经网络】tensorflow实验7--回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法 ②掌握多元线性回归模型的实现方法 ③掌握三维数据可视化方法 2. 实验内容 ①使用TensorFlow建立一元线性回归模型&#xff0c;使用商品房销售数据训练模型&#xff0c;并使用训练好的模型预测房价 ②使用TensorFlow建立多元线…

十、ElasticSearch 实战 - 源码运行

一、概述 想深入理解 Elasticsearch&#xff0c;了解其报错机制&#xff0c;并有针对性的调整参数&#xff0c;阅读其源码是很有必要的。此外&#xff0c;了解优秀开源项目的代码架构&#xff0c;能够提高个人的代码架构能力 阅读 Elasticsearch 源码的第一步是搭建调试环境&…

思维导图从入门到大神

思维导图怎么做&#xff1f;思维导图是一种发散性思维的图。在我们生活的方方面面都有运用。无论是工作、学习、还是生活&#xff0c;我们都可以用到它。那思维导图是怎么绘制的呢&#xff1f;其实非常简单&#xff0c;只要这简单的几步 1、首先在绘制思维导图前&#xff0c;我…

【网络】-- UDP协议

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号&#xff08;Well-Know Port Number&#xff09; 两个问题 netstat pidof UDP协议 UDP的特点 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 传输层 负责数据能够从发送端传输接收端。 再谈端口号 端…

Codeforces Round 861 (Div. 2)(A~D)

A. Lucky Numbers 给出边界l和r&#xff0c;在区间[l, r]之间找到幸运值最大的数字。一个数字的幸运值被定义为数位差的最大值&#xff0c;即数字中最大的数位和最小的数位的差。 思路&#xff1a;因为涉及到至少两位&#xff0c;即个位和十位变化最快&#xff0c;最容易得到相…

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 进程创建回顾2. 再论进程创建2.1 思考2.2 vfork()深度分析2.3 vfork()要点分析2.4 fork()的现代优化2.5 编程实验&#xff1a;fork() &…

被遗忘的Java关键字:transient

前言 今天在看项目代码时候&#xff0c;看到了下面这样一行代码&#xff0c;用transient修饰了一个变量&#xff0c;主要作用是做一个全局开关。说实话我是第一次看到这个关键字。激发了我的好奇心&#xff0c;所以就了解一下这是何方神圣。 /*** 全局开关*/public static tran…

最新研究:可审计的具有拜占庭鲁棒的联邦学习方案

本人新论文&#xff0c;可免费下载&#xff1a;https://download.csdn.net/download/liangyihuai/87727720 Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.…

浅谈拉格朗日插值法

浅谈拉格朗日插值法 好像FFT要用到&#xff0c;所以就学习一手 文章目录 浅谈拉格朗日插值法什么是插值拉格朗日插值法 什么是插值 在离散数据的基础上补插连续的函数&#xff0c;使得这条连续函数经过所有离散数据点&#xff0c;这个过程就叫插值。其意义在于&#xff1a; …

论文阅读:DLME = Deep Local-flatness Manifold Embedding

Author: Zelin Zang, Siyuan Li, Di Wu and Stan Z Li. 1-4: Westlake University 摘要 流形学习&#xff08;ML, Manifold learning&#xff09;旨在从高维数据中识别低维结构和嵌入&#xff0c;然而我们发现现有工作在采样不足的现实数据集上效果不佳。一般的ML方法对数据结…

LNMP网站框架搭建

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程&#xff1a; 1.客户端通过域名进行请求访问时&#xff0c;会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断&#xff0c;如果是静态请求,Nginx会自行处理&#xff0c;并将处理结果返…

【C++】了解设计模式、 stackqueue的使用与模拟实现

文章目录 1.设计模式2.stack1.stack的使用1.stack的结构2.stack的接口 2.stack的模拟实现1.stack的结构2.接口实现 3.queue1.queue的使用1.queue的结构3.queue的接口 2.queue的模拟实现1.queue的结构2.接口实现 4.了解deque1.deque的原理介绍2.deque的底层结构3.deque的迭代器设…

【Android入门到项目实战-- 7.1】—— 如何使用通知?

目录 一、创建通知的步骤 1、创建一个NotificationManager实例 2、使用一个Builder构造器来创建Notification对象 3、设置标题、文字、时间和图标等信息 4、显示通知 二、通知实例演示 三、实现通知的点击效果 1、PendingIntent 什么是PendingIntent&#xff1f; 如何使…

Linux下实现C语言程序

一.情况说明 写这篇博客的情况比较复杂&#xff0c;首先我本来是参加新星计划按照规划现在去学习shell脚本语言的&#xff0c;但是博主现在由于其他原因需要了解makefile&#xff0c;makefile是Linux系统下的一种工具&#xff0c;makefile的一些背景要涉及链接库的知识&#xf…