C++——map|set2

news2024/11/9 6:07:43

目录

map::operator[] 

[ ]的实现 

multimap 

习题 前K个高频单词 

两个数组的交集 

 底层结构


 

pair有俩个成员一个是first,一个是second 

由于pair有俩个模板参数,第一个是first,一个是second

map的insert参数类型是valud_type,value_type就是pair

 pair的key_type对应map的第一个模板参数Key,也就是pair的first

mapped_type对应map的第二个模板参数T,也就是pair的second

map<string, int>::iterator it = countMap.find(str);

这里的string就是第一个模板参数相当于pair的first,int是第二个模板参数相当于pair的second

统计出现的次数

#include<iostream>
#include<map>
using namespace std;
int main()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;
	for (auto& str : arr)
	{
		map<string, int>::iterator it = countMap.find(str);
		if (it != countMap.end())//找到了
		{
			//(*it).second++;
			//it->->second;
			it->second++;
		}
		else //没找到
		{
			countMap.insert(make_pair(str, 1));//没找到就插入
		}
	}
	map<string, int>::iterator it = countMap.begin();
	while (it != countMap.end())
	{
		cout << it->first << it->second << endl;
		it++;
	}
	cout << endl;
	return 0;
}

map::operator[] 

 map容器重载了 [] 运算符,只要知道 map 容器中某个键值对的键的值,就可以向获取数组中元素那样,通过键直接获取对应的值。

[]的返回值是value的引用,如果k不存在,函数会插入一个新的元素,然后返回。

1.map当中有key,返回value的引用(可查找,修改value)

2.map中没有key,会插入一个新元素,新元素是pair(key,V());第一个是key,第二个是value的匿名对象,然后返回value的引用,(可充当插入+修改)

  

这种插入若str不在countMap中,会插入 pair(str,int());,然后再对返回的次数++

如果str在countMap中,返回value(次数)的引用,次数++

[ ]的实现 

 

 insert的返回类型是pair

 insert的返回值

1.key已经在map中,返回pair(key_iterator,false)第一个参数是key的迭代器,如果已经存在第二个参数返回false

2.key不在map中,返回pair(new_key_iterator,true);

模拟实现

 ret.first是迭代器,first->second是value

multimap 

 即使重复,multimap仍然会继续插入

习题 前K个高频单词 

692. 前K个高频单词 - 力扣(LeetCode)

 优先级队列

 这里认为是在建大堆

class Solution {
public:
struct Less//构造大堆
{
    bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2 )const
    {
         if(kv1.second<kv2.second)//先比较出现的次数多少
         return true;
         if(kv1.second==kv2.second&&kv1.first>kv2.first)//出现次数一样,比较字典序大小,大的在前面
         return true;
         return false;
    }
};
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> countMap;
        for(auto &str:words)
        {
            countMap[str]++;
        }//统计出现的个数
       typedef priority_queue<pair<string,int>, vector<pair<string,int>>,Less> maxHeap;
    maxHeap mh(countMap.begin(),countMap.end());
    vector<string> v;
    while(k--)
    {
        v.push_back(mh.top().first);
        mh.pop();
    }
    return v;
    }
};

这里如果用sort排序会非常的麻烦

用stable_sort

 这里不能用map,map会去重

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> countMap;
        for(auto &str:words)
        {
            countMap[str]++;
        }//统计出现的个数
        multimap<int,string,greater<int>> sortMap;
        for(auto& kv:countMap)
        {
            sortMap.insert(make_pair(kv.second,kv.first));
        }
        vector<string> v;
          multimap<int,string,greater<int>>::iterator it=sortMap.begin();
   for(size_t i=0;i<k;++i)
    {
        v.push_back(it->second);
        ++it;
    }
    return v;
    }
};

两个数组的交集 

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set s1(nums1.begin(),nums1.end());
set s2(nums2.begin(),nums2.end());
vector<int> v;
auto it1=s1.begin();
auto it2=s2.begin();
while(it1!=s1.end()&&it2!=s2.end())
{
    if(*it1<*it2)
    it1++;
    else if(*it2<*it1)
    it2++;
    else
    {
    v.push_back(*it1);
    it1++;
    it2++;
    }
}
return v;
    }
};

 349. 两个数组的交集 - 力扣(LeetCode)

 底层结构

这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。
 

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

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

相关文章

PNG免抠素材网,免费商用,设计师赶紧马住。

本期分享设计师必备的免抠素材网站&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/searchlist/66008.html?vNTYwNDUx 网站主要分享设计类素材为主&#xff0c;有平面海报、UI素材、电商素材、免抠素材、背景图片等等。其中免抠元素数量就非常可观&a…

uniapp项目

目录 一、HBuilder创建项目 二、引入uView 2.1 npm方式安装 2.2 下载方式安装 三、小程序的分包 三、App.vue中的生命周期 四、工具封装 五、api接口请求封装 六、store 七、加载顺序 八、flex的使用 一、HBuilder创建项目 文件--新建--项目--默认模板--Vue2--创建 …

CRLFsuite:一款功能强大的CRLF注入扫描工具

关于CRLFsuite CRLFsuite是一款功能强大的CRLF注入扫描工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松扫描和识别目标应用程序中的CRLF注入漏洞。 关于CRLF 回车换行&#xff08;CRLF&#xff09;注入攻击是一种当用户将CRLF字符插入到应用中而触发漏洞…

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:排队论模型解决出租车最佳数量预测(附获奖论文)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…

jsp 大学生心理平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp大学生心理平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用web模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#x…

正点原子STM32(基于HAL库)4

目录ADC 实验ADC 简介单通道ADC 采集实验ADC 寄存器硬件设计程序设计(还没拷贝完)单通道ADC 采集&#xff08;DMA 读取&#xff09;实验ADC & DMA 寄存器硬件设计多通道ADC 采集&#xff08;DMA 读取&#xff09;实验ADC 寄存器硬件设计单通道ADC 过采样&#xff08;16 位分…

【数据结构初阶】第二篇——顺序表

顺序表的概念及其结构 初始化顺序表 销毁顺序表 打印顺序表 增加数据 头插 尾插 指定下标位置插入 删除数据 头删 尾删 删除指定位置 查找数据 修改数据 顺序表的概念及其结构 基本概念 顺序表是用一段物理地址连续的存储单元一次存储数据元素的线性结构&#xf…

Word控件Spire.Doc 【Table】教程(6): 在 Word 中合并或拆分表格单元格

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

AcWing 1072. 树的最长路径(DFS与树形DP)

AcWing 1072. 树的最长路径&#xff08;树形DP&#xff09;一、题目&#xff1a;二、思路&#xff1a;三、代码&#xff1a;四、树形DP1、状态表示2、状态转移3、循环设计4、初末状态5、代码实现一、题目&#xff1a; 二、思路&#xff1a; 为了方便&#xff0c;我们利用下面这…

Vue3现状—必然趋势?

文章目录&#x1f31f; 专栏介绍&#x1f31f; Vue默认版本&#x1f31f; 拥抱Vue3的UI&#x1f31f; Vue3显著优势&#x1f31f; 专栏介绍 凉哥作为 Vue 的忠诚粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#xff0c;Vue 框架目前的地位大…

Python爬虫之Scrapy框架系列(8)——XXTop250电影所有信息同时存储到MySql数据库

现在又不满足于只保存在本地txt文本了&#xff0c;所以来试试存储到数据库mysql里怎么搞呢&#xff1f;&#xff08;首先&#xff0c;要准备好mysql数据库以及navicat数据库可视化管理工具&#xff09; 目录&#xff1a;分析&#xff1a;如何同时存储到本地txt文本以及mysql数据…

回溯详解 LeetCode 46. 全排列 51. N 皇后 52. N皇后 II

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 46. 全排列 51. N 皇后 52. N皇后 II&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 46. 全…

Word处理控件Aspose.Words功能演示:如何在 C# 和Java中将 DOC 转换为 JSON

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

kvm磁盘管理

kvm磁盘管理虚拟磁盘类型rawqcow2qemu-img常用参数主要参数&#xff1a;查看磁盘信息--info创建磁盘文件--create磁盘容量调整--resize磁盘增加容量磁盘缩小容量(生产环境下禁止操作)磁盘调整容量到指定大小转换磁盘格式--convert检查磁盘镜像在线热添加磁盘附加磁盘到vm实例--…

UI自动化测试面试题总结

文章目录一、请描述实现用户登陆模拟自动化测试的思路。二、基于Web端呈现的产品如何做自动化测试&#xff0c;谈谈你的思路和方向。三、什么是web自动化测试&#xff1f;四、什么是selenium&#xff1f;五、写出selenium中你最熟悉的接口或类(*)六、findElement()和findElemen…

java总结(数组)

1.数组概述数组&#xff08;Array&#xff09;是多个相同数据类型按照一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c;通过编号的方式对这些数据进行统一的管理。数组相关概念数组名&#xff1a;下标&#xff08;索引&#xff09;元素数组长度数组特点有序排列数…

sqlserver将mdf文件拆分成多个ndf文件

sqlserver版本&#xff1a;2008R2 1、为什么要拆分 数据库在运行一段时间后mdf文件会迅速增大&#xff0c;这会导致查询速度变慢。或者mdf文件的大小达到了操作系统允许的最大大小&#xff0c;这个时间就必须要进行拆分了。 2、拆分的好处 在没有拆分的时候只有一个mdf主数…

KVM虚拟化技术学习笔记10

虚拟机镜像管理 学习目标&#xff1a; 能够了解KVM虚拟机支持的镜像格式 能够使用qemu-img实现镜像创建 能够使用qemu-img实现镜像查看 能够使用qemu-img实现镜像格式转换 能够了解后备镜像的作用 能够了解差量镜像的作用 能够基于后备镜像制作差量镜像 能够使用差量镜…

SAP ADM100-2.3 系统启动:AS ABAP和AS ABAP+JAVA

一、打开并停止一个SAP Netweaver AS ABAP+JAVA 使用例如SAP MC(SAP Management Console)工具开启并关闭实例。在一个双栈实例中(ABAP+JAVA),JAVA是通过ABAP dispatcher使用Startup and Control Framework开启的,然后它再开启JAVA dispatcher和SP(server Processes)。 …

Qt OpenGL(三十)——Qt OpenGL 核心模式-纹理二(给正方体贴上图片)

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十)——Qt OpenGL 核心模式-纹理二(给正方体贴上图片) 通过前两篇文章,我们知道了如何绘制一个正六面体和使用纹理贴图,本篇继续介绍在正方体(正…