map容器的基本使用

文章目录

  • map
  • map模板参数
  • 默认构造
  • 迭代器
  • [ ]
  • { }
  • insert
  • erase
  • find
  • lower_bound && upper_bound
  • count
  • equal_range

map和set容器,multimap和multiset是树形结构的关联式容器,这四种容器底层原理都是红黑树,容器中的元素是一个有序序列。

map

1.map是关联式容器,它是按照特定的次序(按照key来比较),存储由键key和值value组成的键值对
2.在map中,键值key通常用于排序和唯一的标识元素,而value中存储与此键值key关联的内容。键值key和value的类型可能不同,并且在map内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:
typedef pair<const key, T> value_type;
3.在内部,map中的元素总是按照键值key进行比较排序的
4.map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map模板参数

在这里插入图片描述
Compare:仿函数,缺省参数为less,默认是以升序(对于string是字典序)排序的,我们可以给该类型传递参数greater,将容器中的顺序改为降序。如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)

默认构造

在这里插入图片描述
1.空的map
2.使用区间来初始化
3.拷贝构造
4.移动语义
5.可变参数列表初始化

map<string, string> m1;//空容器vector<pair<string, string>> v{ {"hello", "你好"}, {"sort", "排序" }};
/*cout << (*v.begin()).first << endl;
cout << (*v.begin()).second << endl;*/
map<string, string> m2(v.begin(), v.end());//区间初始化
map<string, string> m3(m2);map<string, string> m4{ { "hello", "你好" }, { "sort", "排序" } };//可变参数列表初始化

迭代器

在这里插入图片描述
begin:返回容器的第一个元素位置
end:返回容器最后一个元素的下一个位置
rbegin:返回最后一个元素位置------底层其实是返回的end() - 1
rend:返回第一个元素的前一个位置------底层其实是返回的begin()-1
c:返回的是const迭代器,元素不可以被修改
迭代器具体实现请阅读C++迭代器底层实现

[ ]

map允许根据key值直接访问对应的value
在这里插入图片描述
在这里插入图片描述
operator[]的返回值value

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" } };
string ret = m1["sort"];//根据[]直接访问元素
cout << ret << endl;
m1["hello"] = "你好!";//修改key值对应的value
cout << m1["hello"] << endl;

map允许通过key对应的修改value

{ }

map<string, string> m;
m.insert({"insert", "插入"});

C++11支持{ },多参数的构造函数隐式类型转换,在底层会将{}转化为make_pair

insert

在这里插入图片描述
map的插入,插入的是键值对
在这里插入图片描述
1.插入一个键值对
3.插入一个区间
4.插入一个可变参数列表

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" } };
m1.insert(make_pair("David", "戴维"));
for (auto& e : m1)
{cout << e.first << ": " << e.second << endl;
}
return 0;

在这里插入图片描述

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" } };
m1.insert(make_pair("David", "戴维"));//插入单个键值对
for (auto& e : m1)
{cout << e.first << ": " << e.second << endl;
}
map<string, string> m2;
m2.insert(m1.begin(), m1.end());//插入一个区间
for (auto& e : m2)
{cout << e.first << ": " << e.second << endl;
}
for (auto& e : m2)
{cout << e.first << ": " << e.second << endl;
}
map<string, string> m3;
m3.insert({ { "hello", "你好" }, { "sort", "排序" } });//插入一个可变参数列表
for (auto& e : m3)
{cout << e.first << ": " << e.second << endl;
}

erase

在这里插入图片描述

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };for (auto& e : m1)
{cout << e.first << ": " << e.second << endl;
}map<string, string>::iterator it = m1.begin();
m1.erase(it);//根据迭代器的指向删除对应的键值对
m1.erase("leave");//根据key删除键值对
cout << endl;
for (auto& e : m1)
{cout << e.first << ": " << e.second << endl;
}
it = m1.begin();
m1.erase(++it, m1.end());//删除某一个区间
cout << endl;
for (auto& e : m1)
{cout << e.first << ": " << e.second << endl;
}

find

在这里插入图片描述
find返回值为指向该键值对的迭代器指针

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };
map<string, string>::iterator it = m1.find("sort");//通过key找到对应的键值对
cout << (*it).first << ": " << (*it).second << endl;
if (it != m1.end())
{m1.erase(it);
}

lower_bound && upper_bound

下界
在这里插入图片描述
上界:在这里插入图片描述

map<string, string> m1{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" }  };
map<string, string>::iterator lower_it1 = m1.lower_bound("hello");
map<string, string>::iterator lower_it2 = m1.lower_bound("i");
cout << (*lower_it1).first << " " << (*lower_it1).second << endl;//hello : 你好
cout << (*lower_it2).first << " " << (*lower_it2).second << endl;//leave : 离开
cout << endl;
map<string, string>::iterator upper_it1 = m1.upper_bound("hello");
map<string, string>::iterator upper_it2 = m1.upper_bound("i");
cout << (*upper_it1).first << " " << (*upper_it1).second << endl;//leave : 离开
cout << (*upper_it2).first << " " << (*upper_it2).second << endl;//leave : 离开

map中的数据默认是以字典序进行排序的

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };
map<string, string, greater<string>> m2{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };for (auto& e : m1)
{cout << e.first << ": " << e.second << endl;
}cout << endl;
for (auto& e : m2)
{cout << e.first << ": " << e.second << endl;
}

在这里插入图片描述

count

在这里插入图片描述
根据key统计它在容器中出现的次数,主要用于multimap中,因为map中不允许出现相同key的数据,对于multimap允许出现同key的数据,即使value也是相同的

map<string, string> m1{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" },{"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" } };multimap<string, string> m2{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" },{"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" } };
cout << m1.count("David") << endl;//1
cout << m2.count("David") << endl;//2
m2.insert({ "David", "阿伟" });
cout << m2.count("David") << endl;//3

equal_range

在这里插入图片描述
在这里插入图片描述
用于返回一个多个相同key在容器中的区间,这个函数也是主要用于multimap中,对于map某一个key在这个容器中最多只会出现一次因此用处不大
返回值是一个pair对象,first指向该key值在容器中第一次出现的位置指向的仍是一个pair对象,second指向该key值在容器中最后一次出现位置的下一个位置,如果没有该key值,则返回的是一个不存在的区间
下面的it1.first在这里指向的仍是一个pair对象

map<string, string> m1{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" }};multimap<string, string> m2{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" },
{"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" }, {"David", "戴维"}};pair<map<string, string>::iterator, map<string, string>::iterator> it1 =  m1.equal_range("David");
pair<multimap<string, string>::iterator, multimap<string, string>::iterator> it2 = m2.equal_range("David");
cout << it1.first->first << " " << it1.second->first << endl;
//等价于(*it1.first).second
cout << it2.first->first << " " << it2.second->first << endl;m2.erase(it2.first, it2.second);for (auto& e : m2)
{cout << e.first << ": " << e.second << endl;
}

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

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

相关文章

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址&#xff1a;https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置&#xff0c;在搜索框输入&#xff1a;系统高级设置。 新建环境变量&#xff0c;并输入bin目录具体位置。 安装检查 按住 w…

Ubuntu 系统的基础操作和使用

文章目录 前言常用命令1. 基本操作lscdpwd 2. 对文件的操作touchcatechovim 3. 对目录的操作mkdirrm 4. 移动文件 / 目录的操作cpmv 5. 总结基本操作6. 必不可少的实用操作mangreppsnetstat 总结 前言 本文内容为一些超常用命令, 内容不多且十分实用, 这些命令是每一个开发人员…

Head First Design Patterns - 策略模式

策略模式 策略模式&#xff1a;策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化&#xff0c;行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可…

每日一练(编程题-C/C++)

目录 CSDN每日一练1. 2023/2/27- 一维数组的最大子数组和(类型&#xff1a;数组 难度&#xff1a;中等)2. 2023/4/7 - 小艺照镜子(类型&#xff1a;字符串 难度&#xff1a;困难)3. 2023/4/14 - 最近的回文数(难度&#xff1a;中等)4. 2023/2/1-蛇形矩阵(难度&#xff1a;困难)…

算法通关村第十关—归并排序(黄金)

归并排序 一、归并排序原理 归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干个比较小的数组&#xff0c;分成几个比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分就是将问题分(divide)成一些小的问题分…

BIT-6-指针(C语言初阶学习)

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址平时口语中说的指针&#xff0c;通常…

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

【什么是反射机制?为什么反射慢?】

✅ 什么是反射机制&#xff1f;为什么反射慢&#xff1f; ✅典型解析✅拓展知识仓✅反射常见的应用场景✅反射和Class的关系 ✅典型解析 反射机制指的是程序在运行时能够获取自身的信息。在iava中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有…

合并两个有序链表算法(leetcode第21题)

题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a;输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a;输入&#xff1a;l1 [], l2 [] 输…

【FPGA 器件比较】Altera -- Xilinx

比较以下市场前二名的产品线及定位 应用场景XilinxAltera高性能VersalAgilex F/I性能Virtex / Kintex / Artix / Zynq UltraScaleAgilex F/I / Stratix 10中档Virtex / Kintex / Zynq ~ 7 / UltraScaleStratix 10 / Arria 10低成本Artix-7 Sparton-7Cyclone 10 如上表&#x…

06_树的入门

二叉树入门 树的基本定义树的相关术语二叉树的基本定义二叉查找树的创建二叉树的结点类二叉查找树API设计二叉查找树实现二叉查找树其他便捷方法查找二叉树中最小的键查找二叉树中最大的键 二叉树的基础遍历前序遍历中序遍历后序遍历 二叉树的层序遍历二叉树的最大深度问题折纸…

【图文教程】windows 下 MongoDB 介绍下载安装配置

文章目录 介绍MySQL 之间的区别和适用场景差异数据模型&#xff1a;查询语言&#xff1a;可扩展性&#xff1a;数据一致性&#xff1a; 下载安装环境变量配置 介绍 MongoDB 是一种开源的、面向文档的 NoSQL 数据库管理系统。它使用灵活的文档模型来存储数据&#xff0c;这意味…