c++:刷题必备 容器map的使用

news2024/9/21 12:36:11

文章目录

  • map的概念
  • map的使用
    • 构造![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/30e9a697b50d47a591af6e9ae2bbb7d7.png)
    • insert
    • 迭代器+遍历
  • find
  • operator[]
  • 举例


map的概念

map是一个关联容器,里面的每一个位置pair,会存储两个值,一个是key,另一个是value.
我们可以通过搜索key得到value.

比如英语翻译的软件:输入一个英语单词 left(key),就能得到翻译 左边(value).
事实上,英语翻译软件底层也就是这样.

map的使用

构造在这里插入图片描述

	map<string, string> dict;

首先,map的构造需要我们传至少两种类型.
比如上面Key是string,T是string.

insert

	//构造有名对象
	pair<string, string> kv1 = { "left","左边" };
	dict.insert(kv1);
	//构造匿名对象
	dict.insert(pair<string, string>("right", "右边"));
	//函数传参
	dict.insert(make_pair("sort", "排序"));
	//隐式类型转化
	dict.insert({ "string", "字符串" });

map中为了使得两个值key-value关联到一起,会把它们绑定成一个类.
map的插入推荐用最后一种,隐式类型转化.
隐式类型转化本质是就是在传参时构造一个pair的临时对象,与上面构造匿名对象等类似.

迭代器+遍历

void test_map1()
{
	map<string, string> dict;
	//构造有名对象
	pair<string, string> kv1 = { "left","左边" };
	dict.insert(kv1);
	//构造匿名对象
	dict.insert(pair<string, string>("right", "右边"));
	//函数传参
	dict.insert(make_pair("sort", "排序"));
	//隐式类型转化
	dict.insert({ "string", "字符串" });

	map<string, string>::iterator it = dict.begin();
	while (it != dict.end())
	{

		cout << it->first << ":" << it->second << endl;
		//cout << it.operator->()->first << ":" << it.operator->()->second << endl;
		it++;
	}
}

map的迭代器使用和vector等容器类似.但是因为map里面存储的是键值对<key,value>,所有打印起来比较麻烦.

		cout << it->first << ":" << it->second << endl;
		//cout << it.operator->()->first << ":" << it.operator->()->second << endl;

这两行代码可能理解起来稍微复杂一点.
key是first,value是second,这里是按照存储顺序排列.
我们一个键值对<key,value>和其他一堆东西的组合想象成一个节点.it是一个指针,指向这个节点.
map类里面写的运算符重载it.operator->()会返回键值对<key,value>的指针,用这个指针可以指向key和value
.我们在使用可以直接省略.operator->().

理解了这个,就能更好的理解下面的范围for

	for (auto& e : dict)
	{
		cout << e.first << ":" << e.second << endl;
	}

e相当于键值对<key,value>的引用.这个的底层和上面类似.只不过在书写方面简单一些.
在这里插入图片描述

find

	//map<string, string>::iterator pos = dict.find("left");
	auto pos = dict.find("left");
	if (pos != dict.end())
	{
		cout << pos->first << ":" << pos->second << endl;
	}

find输入key值,找到会返回该节点的迭代器,找不到会返回迭代器的终点dict.end().

operator[]

operator[]是map里面内置的最强的函数,在我们刷题时帮助巨大.
首先看看operator的底层

//V& operator[](const K& key)
//{
//	pair<iterator, bool> ret = insert({ key ,V() });
//	iterator it = ret.first;
//	return it.second;
//}

operator[]会调用insert函数,insert函数里面传key值和value的默认构造.
不管插入是否成功,都会返回键值对pair<iterator, bool>,
bool里面表示插入成功与否,
iterator则返回key值所在的节点的迭代器.我们取得这个迭代器,然后返回value的引用.

void test_map2()
{
	//string可以直接构造字符串数组
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
"苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };
	map<string, int> kv;
	//按字典序排序
	for (auto& e : arr)
	{
		//V& value=kv[e] value++;
		kv[e]++;
	}
	for (auto& e : kv)
	{
		cout << e.first << ":" << e.second << endl;
	}
}

在这里插入图片描述

举例

leetcode: 692. 前K个高频单词
在这里插入图片描述
在计算单词出现次数时,要把单词和出现次数链接起来,就得用到map.

class Solution {
public:
//仿函数,控制比较逻辑
struct Com
{
     //出现次数大的在前面,一样按照字典序小的在前面.
    bool operator()(pair<string,int>& p1,pair<string,int>&p2)
    {
        return p1.second>p2.second 
        || (p1.second==p2.second && p1.first<p2.first);
    }
};
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> m;
        for(auto& e:words)
        {
            //map里面的[]调用insert函数,这个函数会返回第二个值的引用
            m[e]++;
        }
        //把map里面的键值对存到vector进行排序
       
        vector<pair<string,int>> vp(m.begin(),m.end());

        //函数模板要传对象
        sort(vp.begin(),vp.end(),Com());
        vector<string> ret;
        for(size_t i=0; i<k; i++)
        {
            ret.push_back(vp[i].first);
        }
        return ret;
    }
};

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

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

相关文章

使用docker安装seafile

使用docker安装seafile 1 介绍seafile Seafile 是一款开源的企业云盘&#xff0c;支持全平台&#xff08;浏览器、Windows、Mac、Linux、Android、IPhone等&#xff09;客户端。Seafile 内置协同文档 SeaDoc &#xff0c;让协作撰写、管理和发布文档更便捷。最重要的这是国产…

一件事做了十年

目录 一、背景二、过程1.贫困山区的心理悲哀2.基础差的客观转变3.对于教育的思考4.持续做这件事在路上5.同行人有很早就完成的&#xff0c;有逐渐放弃的&#xff0c;你应该怎么办&#xff1f;6.回头看&#xff0c;什么才是最终留下的东西? 三、总结 一、背景 在哪里出生我们无…

关于一致性,你该知道的事儿(下)

关于一致性&#xff0c;你该知道的事儿&#xff08;下&#xff09; 前言一、并发修改单个对象1.1 原子写操作1.2 显示加锁1.3 原子的TestAndSet1.4 版本号机制 二、 多个相关对象的一致性2.1 最大努力实现2.2 2PC && TCCC2.3.基于可靠消息的一致性方案2.4.Saga事务 三、…

docker搭建redis6.0(docker rundocker compose演示)

文章讲了&#xff1a;docker下搭建redis6.0.20遇到一些问题&#xff0c;以及解决后的最佳实践方案 文章实现了&#xff1a; docker run搭建redisdocker compose搭建redis 搭建一个redis’的过程中遇到很多问题&#xff0c;先简单说一下搭建的顺序 找一个redis.conf文件&…

LaTeX多行公式中\split出现一长一短多行公式无法居中

最近在整理一篇论文时出现了一长一短多行公式的问题无法居中 类似下图的情况&#xff1a; 这部分的代码如下&#xff1a; \begin{equation} \begin{split} \scalebox{0.75}{$X_{n} C$}\\ \scalebox{0.75}{$X_{m} \biggl\{\begin{array}{ll} \sum\limits_{i1}^{n} [X_{i} …

Java语法学习九之内部类和异常

目录 内部类 实例内部类 静态内部类 局部内部类 匿名内部类 异常 异常的体系结构 异常的分类 编译时异常 运行时异常 异常的处理 防御型编程 异常的抛出 异常的捕获 异常声明throws ​编辑 try-catch捕获并处理 finally 自定义异常类 内部类 实例内部类 p…

二叉树的非递归遍历(c++)

前序 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-tree-preorder-traversal/description/ 1---2---4---5--…

如何修复显示器或笔记本电脑屏幕的黄色色调?这里提供几种方法

序言 如果你的笔记本电脑屏幕呈淡黄色,则可以启用夜灯功能。该问题也可能源于连接松散的显示电缆、损坏的显卡驱动程序或错误配置的显示器设置。以下是一些故障排除步骤,你可以尝试解决此问题。 禁用夜间模式 夜间模式功能旨在减少显示器的蓝色色调,使屏幕看起来更温暖,…

解决axios发送post请求,springMVC接收不到数据问题

今天发现一个问题&#xff1a; vue组件中无法正确接收并处理axios请求 这个问题已经困扰我好久了&#xff0c;在电脑面前坐了两天只能确定前端应该是正确的发送了请求&#xff0c;但发送请求后无法正确接受后端返回的数据。 问题&#xff1a;vue组件无法接受后端数据 错误代码如…

【信号与槽机制】

信号与槽机制 &#x1f31f; 信号函数&#x1f31f; 槽函数&#x1f31f; 连接函数&#x1f338; QObejct::connect函数剖析&#x1f31f; 官方文档中给出的定义&#x1f31f;《Qt 5.9 C开发指南》中的定义 &#x1f31f; 信号函数 信号是一种特殊的成员函数&#xff0c;用于在…

JVM 类加载机制

JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段&#xff0c;这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…

用户管理中心——登录功能

用户管理中心——登录功能 一、用户登录1. 登录设计2. 登录方法实现实现细节逻辑删除实现代码 3. 登录接口实现4. 测试 二、用户管理用户管理接口 一、用户登录 1. 登录设计 2. 登录方法实现 实现细节 首先在接口中com.example.demo.service.UserService定义一个用户登录doL…

HSB色彩模式计算详解

HSB色彩模式计算详解 前些天撰文几篇介绍了几种圆形和矩形的HSB绘制方法。后2篇介绍了HSB的计算方法。我感到不是很详细&#xff0c;今再补充说明计算方法。 圆形H调色板选色,计算 Rad, ang, L&#xff0c; return H 计算二点距离 L&#xff0c;取色点到圆心距离 x0250;…

https://是怎么实现的?

默认的网站建设好后都是http访问模式&#xff0c;这种模式对于纯内容类型的网站来说&#xff0c;没有什么问题&#xff0c;但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站&#xff0c;为避免这种情况下发生&#xff0c;所以传统的网站改为https协议&#xff0c;这种协议自己…

【牛客】SQL201 查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

1、描述 有一个薪水表&#xff0c;salaries简况如下&#xff1a; 请你查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t&#xff0c;以上例子输出如下&#xff1a; 2、题目建表 drop table if exists salaries ; CREATE TABLE salaries ( emp_no int(11) NOT N…

【深入理解MySQL的索引数据结构】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4d5;索引底层数据结构与算法&#x1f4d9;索引数据结构&#x1f4d8;二叉树&#x1f4d8;红黑树&#x1f4d8;Hash&#x1f4d8;B-Tree&#x1f4d8;BTree &#x1f4d9;表在不同存储引擎的存储结构&#x1f4d8;…

react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)

什么是 Context 机制&#xff1f; Context 机制是 react 实现外层组件向内层组件传值的一种方案&#xff0c;父组件可以向其内部的任一组件传值&#xff0c;无论是子组件还是孙组件或更深层次的组件。 实现步骤 1.使用createContext方法创建一个上下文对象 Ctx 2.在顶层组件中通…

基恩士PLC-KV5500基础入门

一、准备工作&#xff1a; 1.准备的东西&#xff1a;一个基恩士PLC-KV5500模块。两个自复位开关&#xff0c;24v LED灯一个&#xff0c;24v开关电源一个&#xff0c;KV5500端子台IO线缆&#xff1b;有编程软件的电脑一台。 编程软件&#xff1a; 基恩士PLC-KV5500接线图&…

妙笔生花,创作无限——WonderPen妙笔 for Mac

写作&#xff0c;是灵感的流淌&#xff0c;是心灵的独白。WonderPen妙笔 for Mac&#xff0c;为您的灵感插上翅膀&#xff0c;让您的创作更加流畅自如。它拥有简洁直观的界面设计&#xff0c;让您的思绪在纯净的写作环境中自由飞翔。多种写作模式&#xff0c;满足您不同的创作需…

vue2基础语法02——计算属性、方法、侦听器

vue2基础语法02——计算属性、方法、侦听器 1. 计算属性 computed1.1 为什么要用计算属性1.2 简单例子1.2.1 例子1.2.2 计算属性缓存 1.3 计算属性的 setter 2. 方法 methods2.1 例子2.2 说明2.3 简单方法替换实现 3. 侦听属性 watch3.1 介绍3.2 值的情况3.2.1 对应回调函数3.2…