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

文章目录

  • 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;
    }
};

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

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

相关文章

【MySQL数据库开发设计规范】之表设计规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…

使用 Docker 部署 VS Code in The Browser

1&#xff09;介绍 GitHub&#xff1a;https://github.com/coder/code-server 在日常学习工作中&#xff0c;Vscode 已成为我们首选的代码编辑器。然而&#xff0c;其局限性在于当我们从家到公司移动时&#xff0c;难以保持连续的编码体验。针对这一痛点&#xff0c;虽然市面上…

只需三步将Kimi接入微信公众号

今天我将手把手交大家如何把Kimi大模型接入微信公众号&#xff0c;创建属于你自己的公众号智能助理&#xff0c;让你的公众号具备智能对话、文件阅读、信息搜索等强大功能&#xff0c;同时提高用户互动率、减少人工客服压力等。 废话不多说&#xff0c;先来看看实际效果吧~ 一…

16 华三数据中心最流行的技术 M-LAG

STP和MTP&#xff08;第二十二课&#xff09;-CSDN博客 VRRP技术和浮动路由(第二十六课)_vrrp 浮动路由-CSDN博客 VRRP DHCP ACL NAT 网络核心路由技术综述 (第十课)-CSDN博客 04 交换机的IRF的配置-CSDN博客 1 M-LAG AI介绍 M-LAG&#xff08;Multi-Chassis Link Aggrega…

Electron学习笔记(一)

文章目录 相关笔记笔记说明 一、轻松入门 1、搭建开发环境2、创建窗口界面3、调试主进程 二、主进程和渲染进程1、进程互访2、渲染进程访问主进程类型3、渲染进程访问主进程自定义内容4、渲染进程向主进程发送消息5、主进程向渲染进程发送消息6、多个窗口的渲染进程接收主进程发…

【python】python淘宝交易数据分析可视化(源码+数据集)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

模型推导:BG/NBD(预测用户生命周期(CLV)模型)

CLV&#xff08;Customer Lifetime Value&#xff09;指的是客户生命周期价值&#xff0c;用以衡量客户在一段时间内对企业有多大的价值。企业对每个用户的流失与否、在未来时间是否会再次购买&#xff0c;还会再购买多少次才会流失等问题感兴趣&#xff0c;本文中的BG/NBD模型…

PostgreSQL数据库创建只读用户的权限安全隐患

PostgreSQL数据库模拟备库创建只读用户存在的权限安全隐患 default_transaction_read_only权限授权版本变更说明 看腻了就来听听视频演示吧&#xff1a;https://www.bilibili.com/video/BV1ZJ4m1578H/ default_transaction_read_only 创建只读用户&#xff0c;参照备库只读模…

第三步->手撕spring源码之基于Cglib实现实例化策略

为什么深入研究spring源码&#xff1f; 其实每一个程序员每天的工作都是一贯的CRUD 实现业务和需求完成的操作。几年这样的操作让我感觉在这方面要提神能力 光靠CRUD是绝对不可能的事情 CRUD只是满足你作为一个搬砖人而已。编程能力提升&#xff1f;其实更多的编程能力的提升是…

用 Supabase CLI 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…

Promise.all和 race

Promise.all() all方法可以完成并行任务&#xff0c; 它接收一个数组&#xff0c;数组的每一项都是一个promise对象。返回值&#xff1a; 成功时&#xff1a;当数组中所有的promise的状态都达到resolved的时候&#xff0c;就返回包含所有 Promise 结果的数组&#xff0c;并且…

【C++】————类与对象(上)-基础知识

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 类的两种定义方式&#xff1a; 成员变量命名规则的建议&#xff1a; 4.类的访问限定符及封装 4.1 访问限定符 ​编辑 【面试题】问题&#xff1a;C中struct和class的区别是什么&#xff1f; 4.2 封装 【面试…

数据分析中大数据和云计算

大数据和云计算 前言一、大数据二、大数据定义三、数据存储单位四、大数据存储技术五、大数据应用技术六、大数据特征七、数据容量八、数据类型的多样性结构化数据半结构化数据非结构化数据 九、获取数据的速度十、可变性十一、真实性十二、复杂性十三、价值十四、云计算十五、…

小白有什么副业可以做?

对于小白来说&#xff0c;以下是一些适合做副业的选择 1. 网络销售 可以在电商平台上开设小店&#xff0c;销售自己感兴趣的产品&#xff0c;如手工制品、二手物品、个人设计的商品等。 2. 做任务 目前网上最流行的就是做任务&#xff0c;因为简单无门槛&#xff0c;我推荐百…

partially initialized module ‘replicate‘ has no attribute ‘run‘

partially initialized module replicate has no attribute run(most likely due to a circular import) 在包名上停留查看impot 包的地址。 报错原因&#xff1a; 文件重名了&#xff0c;导入了 当前文件 。 修改文件名 即可。

分布式版本控制工具 - Git

文章目录 1. 概念介绍2. 客户端2.1 介绍2.2 仓库操作2.3 文件操作2.4 分支原理与操作2.5 标签2.6 远程仓库2.7 README与IGNORE 3. IDEA集成4. 版本号4.1 介绍4.2 文件操作4.2 分支操作 5. 命令5.1 介绍5.2 仓库操作5.3 文件操作5.4 分支操作5.5 标签操作5.6 远程仓库 1. 概念介…

【WebGPU】WebGPU 中的反应扩散计算着色器

在本教程中&#xff0c;我们将使用 WebGPU 技术中的计算着色器实现图像效果。更多精彩内容尽在数字孪生平台。 程序结构 主要构建两个 WebGPU 管道&#xff1a; 运行反应扩散算法多次迭代的计算管道&#xff08;js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识&#xff0c;下面我们将介绍缓冲区的相关知识。 本质上来说&#xff0c;缓冲区就是一块内存区域&#xff0c;因为内核上的缓冲区较复杂&#xff0c;所以本文主要介绍C语言的缓冲区。 目录 1.为什么要有缓冲区 2.应用层缓冲区的默认刷新策略 …

【C++】STL — map和set的使用详细介绍

前言 本章将继续学习STL中的两个很重要的容器map和set&#xff0c;其底层实现是封装了一个红黑树&#xff0c;我们通过本节来学习和深入了解一下这两大容器。。。 序列式容器&#xff1a; string 、Vector、List 、dequeue 关联式容器&#xff1a;MAP 、SET、nordered_map、uno…

成员函数构造函数析构函数

文章目录 类的6个默认成员函数构造函数概述定义特性 析构函数概述特性 类的6个默认成员函数 空类&#xff1a; 如果一个类里面什么都没有写&#xff0c;我们称之为空类 class Date {};空类真的什么都没有吗&#xff1f; 实际上并非如此&#xff0c;编译器会自动生成6个默认成…