当前位置: 首页 > article >正文

详析STL之容器map

前言:在上一篇文章中,我分享了容器的set的相关知识,我们知道set里面只存一个key(虽然底层也是pair<key,value>),存储的不是键值对,那么今天我就来 分享一个存储键值对的容器。

map的介绍

老规矩,我们先来看看文档中是如何介绍map的。
在这里插入图片描述

那么我来对文档里面内容简要概括一下。

1.map是关联式容器(在set那一篇文章讲过什么是关联式容器),按照key的值进行比较,存储的是由key和value共同组成的键值对的元素。
2.在map中,key用于排序和标识元素的位置,而value的值与key值相关,key的值可以和value值是不同类型,它们通过value_type成员类型共同绑定在一起,构成pair<key,value>
在这里插入图片描述
我们可以看到pair有两个参数,一个是first,另一个是second,first存的是key,second存的是与key相对应的值。
3.map支持下标访问符,即在[]加上key,就可以通过key找到对应的value
4.map底层是由平衡二叉搜索数(红黑树)实现的

map模板参数在这里插入图片描述

key:键值对中key的类型
value:键值对中value的类型
Comper:比较器类型,默认情况下按小于比较
Alloc:通过空间配置器来申请底层空间

map使用

map如果需要使用,需要先展开STL库和包含头文件

#include <map>
using namespace std;

map定义

map<类型名,类型名> 变量名;

map里面可以是不同类型。
举例:

map<string, int> m;

map元素的访问

1.迭代器遍历:

map的迭代器遍历和set迭代器遍历差不多,map只需要注意类型可以不同就行了。

map<string, int>::iterator it = m.begin();
while (it != m.end())
{
	cout << it->first << " " << it->second << " ";
	++it;
}
cout << endl;

我们来看看map的value值能不能修改

	map<string, int> m;
	m.insert(make_pair("苹果",1));
	m.insert(make_pair("苹果", 2));
	m.insert(make_pair("苹果", 3));
	m.insert(make_pair("火龙果", 4));

map<string, int>::iterator it = m.begin();
while (it != m.end())
{
	it->second = 1;
	cout << it->first << " " << it->second << " ";
	++it;
}
cout << endl;

在这里插入图片描述
结果显而易见,map的value值可以修改,那么为什么map的value值可以修改呢?
这是由于map支持operator[]访问和修改value,那么我们来看看map的operator[]的文档吧。

operator[]插入和遍历

在这里插入图片描述
由文档我们可知operator[]通过k和某个元素的键进行比较,如果存在,则返回key所在位置的迭代器
如果不存在,则插入含有该键的新的元素,并返回新插入元素的位置的迭代器

调用map的operator[]相当于调用

在这里插入图片描述
可能有老铁一下子看不懂这句代码,我来为大家解释一下。
insert(make_pair(k,mapped_type)):这句是创建了一个新的键值对,k是key,mapped_type是value(make_pair和pair类似,只是make_pair会自动推导类型)

this->insert(make_pair(k,mapped_type())):表示实例对象调用插入接口函数,插入该键值对。

(this->insert(make_pair(k,mapped_type())).first):插入键值对到实例对象中,第一个值first返回的是一个迭代器,它指向新插入的元素或已经存在具有相同键的元素(也是pair<key,value>),然后再对该元素进行解引用,取该元素本身。

(*(this->insert(make_pair(k,mapped_type())).first).second):表示取该元素里面的value

//operator[]插入新的数据
m["香蕉"] = 1;
//operator[]查找已有的数据
cout << m["苹果"] << endl;
map<string, int>::iterator it = m.begin();
while (it != m.end())
{
	it->second = 1;
	cout << it->first << " " << it->second << " ";
	++it;
}
cout << endl;

在这里插入图片描述

范围for遍历(底层也是迭代器)

for (auto kv : m)
{
	cout << kv.first << " " << kv.second << endl;
}

map成员函数接口

map插入

在这里插入图片描述
在这里插入图片描述
我们看到map的insert插入的 是一个键值对,如果插入成功,则返回一个迭代器和true(也就是该类型pair<iterator,bool>),插入失败,返回一个迭代器和false

举例

map<string, int> m;
m.insert(pair<string, int>("苹果",1));

还可以使用make_pair进行插入

map<string,int> m;
m.insert(make_pair("苹果"1));

由于map接下来的常用的成员函数接口的使用方法和set对应的成员函数接口差不多,所以笔者就不在详细解释了,如果有那个常用的成员函数不懂,可以看set那篇文章,在文章末尾我也会附贴上c++文档的网址。

map常用的成员函数接口

void erase(iterator x)删除x位置上的元素
size_type erase (const key_type& k)删除键值为k的元素
void erase (iterator first, iterator last)删除[first,last]区间内的元素
iterator find (const key_type& k)查找key为k的元素,找到了返回该元素所在位置的迭代器,找不到返回end位置的迭代器
bool empty() const判断map是否为空(即大小是否为0),如果是空的返回true,否则返回false
void swap (map& x)一个map<类型名,类型名>和另一个同类型map<类型名,类型名>交换元素
size_type size() const返回map中有效元素的个数
size_type count (const key_type& k) const统计map中key为k的键值的个数,个数只有1(表示存在)和0(表示不存在),因为map可以出重
void clear()将map中的元素清空

总结:

C++文档网址

1.我们要知道map中的元素是键值对
2.map的key也是唯一的不能修改的,只能修改key所对应的键值value
3.map的底层是红黑树,搜索效率非常高,时间复杂度是O(logN)
4.map默认是按升序(key从小到大)进行排序的,如果使用迭代器进行遍历,就能得到一个有序的序列


http://www.kler.cn/a/369239.html

相关文章:

  • 【每日一题】LeetCode - 判断回文数
  • 雷池社区版OPEN API使用教程
  • cmake命令使用
  • 从0到1,用Rust轻松制作电子书
  • C++算法练习-day15——1.两数之和
  • C++题目整理
  • R语言笔记(四):函数
  • Qt 窗口可见性 之 工程案例
  • Spark的Torrent Broadcast 详解
  • 基于YOLOv11的动物类别实时检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)
  • Python 基础语法 - 赋值运算符
  • 无人机之倾斜摄影技术篇
  • 【代码随想录Day53】图论Part05
  • 海外服务器的价格取决于服务器的性能和租赁时间
  • leetcode-73-矩阵置零
  • 【LeetCode】每日一题 2024_10_22 构成整天的下标对数目 I(暴力/哈希)
  • Golang | Leetcode Golang题解之第502题IPO
  • 嵌入式1_ARM学习(六)——Makefile
  • 【GPIO】2.ADC配置错误,还是能得到电压数据
  • CRC 校验码
  • 【iOS】知乎日报第一周总结
  • Vue3_开启全局websocket
  • Qt6切换音轨
  • ffmpeg视频滤镜:均值模糊-boxblur
  • MAN Truck Bus EDI 需求分析
  • Flutter Column组件实战案例