C++STL——map与set介绍及使用

news2024/11/16 5:50:39

map与set介绍及使用

  • 关联式容器
  • 健值对
  • set
    • multiset
  • map
    • multimap

关联式容器

之前我们学的list,vector等等是序列式容器,这里的set和map和之后的哈希表都是关联式容器,比如说搜索二叉树我们想插入一个值,不能随意的插入,因为每个数都是有关联的,需要找到准确位置才能进行插入。

健值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代
表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然
有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应
该单词,在词典中就可以找到与其对应的中文含义。
SGI-STL中关于键值对的定义:

template <class T1, class T2>
struct pair
{
	typedef T1 first_type;
	typedef T2 second_type;
	T1 first;
	T2 second;
	pair() : first(T1()), second(T2())
	{}
	pair(const T1& a, const T2& b) : first(a), second(b)
	{}
};

在这里插入图片描述
https://legacy.cplusplus.com/reference/utility/pair/?kw=pair

set

set文档介绍:https://cplusplus.com/reference/set/set/
这是一颗平衡搜索二叉树,也就是说不会出现那种只出现一边倾斜的情况,时间复杂度是稳定的 O(logN).

template < class T, // set::key_type/value_type
class Compare = less< T >, // set::key_compare/value_compare
class Alloc = allocator< T > // set::allocator_type
> class set;

在这里插入图片描述

#include<iostream>
#include<set>
using namespace std;

int main()
{
	set<int>tree;
	tree.insert(1);
	tree.insert(3);
	tree.insert(9);
	tree.insert(4);
	tree.insert(1);
	tree.insert(7);
	tree.insert(1);
	tree.insert(3);

	for (auto& e : tree)//这里的e尽量用引用
	{
		cout << e << ' ';
	}
	cout << endl;

	return 0;
}

在这里插入图片描述
首先我们看这段代码,了解到set的功能就是排序+去重的功能。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一个参数是插入一个值。第二个是在某个位置插入一个值,但是这个接口要慎用,因为有可能破坏树的结构。第三个是迭代器的区间。
在这里插入图片描述
第一个参数是迭代器位置。第二个是值,这里如果删除的值不存在会返回0,存在返回1。第三个是迭代器区间。
在这里插入图片描述
这里是查找一个值,返回的是迭代器的位置,如果没有找到就返回end的位置。
在这里插入图片描述
这个接口的作用是统计这棵树中有多少个这个值的结点。
这个接口是为了multiset存在的。

multiset

multiset文档介绍https://cplusplus.com/reference/set/multiset/

template < class T, // multiset::key_type/value_type
class Compare = less, // multiset::key_compare/value_compare
class Alloc = allocator > // multiset::allocator_type
> class multiset;

在这里插入图片描述
multiset是允许值冗余:

#include<iostream>
#include<set>
using namespace std;

int main()
{
	multiset<int>tree;
	tree.insert(1);
	tree.insert(3);
	tree.insert(9);
	tree.insert(4);
	tree.insert(1);
	tree.insert(7);
	tree.insert(1);
	tree.insert(3);

	for (auto& e : tree)//这里的e尽量用引用
	{
		cout << e << ' ';
	}
	cout << endl;

	return 0;
}

在这里插入图片描述
这就是为什么set要设计要设计一个count接口了:
在这里插入图片描述
那么在查找这棵树的1的时候,先找到的就是中序遍历的第一个1。

#include<iostream>
#include<set>
using namespace std;

int main()
{
	multiset<int>tree;
	tree.insert(1);
	tree.insert(3);
	tree.insert(9);
	tree.insert(4);
	tree.insert(1);
	tree.insert(7);
	tree.insert(1);
	tree.insert(3);

	auto it = tree.find(1);
	while (it != tree.end())
	{
		cout << *it << ' ';
		it++;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
迭代器所有的区间基本都符合左闭右开的特性:

upper_bound是>
lower_bound是>=

map

template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;

在这里插入图片描述
map也是一个平衡二叉搜索树,是一个KV模型。
上面的键值对,是数中结点值的类型。

#include<iostream>
#include<map>
using namespace std;

int main()
{
	map<string, string>dict;
	dict.insert(pair<string, string>("一", "one"));
	dict.insert(pair<string, string>("二", "two"));
	dict.insert(pair<string, string>("三", "three"));
	dict.insert(make_pair("四", "four"));//这里和上面三个是等价的写法

	return 0;
}

在这里插入图片描述

#include<iostream>
#include<map>
using namespace std;

int main()
{
	map<string, string>dict;
	dict.insert(pair<string, string>("一", "one"));
	dict.insert(pair<string, string>("二", "two"));
	dict.insert(pair<string, string>("三", "three"));
	dict.insert(make_pair("四", "four"));//这里和上面三个是等价的写法
	for (const auto& e : dict)//如果不改变加const,e前面不加引用就是这个类型的拷贝构造,代价有些大
	{
		cout << e.first << ":" << e.second << endl;//e不能直接访问,因为<<没有对pair类型进行重载
	}	
	return 0;
}

在这里插入图片描述
map当中最重要的是:
在这里插入图片描述

(*((this->insert(make_pair(k,mapped_type()))).first)).second

返回值很长,逐步分析:
首先看一下insert的返回值

pair<iterator,bool> insert (const value_type& val);

在这里插入图片描述
这里如果插入(没有一个与他相同的key)成功就返回true,插入失败失败返回false。
注意:无论成功与否都会返回一个迭代器。

那么operator[]中返回值插入的是什么?
make_pair(k,mapped_type())
插入的是k, value类型的匿名对象,在这里匿名对象会仅有默认值,比如int类型就是0,指针类型就是空指针等等。
也就是说,插入接口调用完之后返回的迭代器的位置就是pair对应的位置,然后去调用first,也就是插入返回的iterator值,就是k对应的结点,然后再去找second,也就是k对应的结点的value。
也就是说,这个operator[]可以插入,修改,查找。(要小心,如果一个值没有,会进行插入的操作)

#include<iostream>
#include<map>
using namespace std;

int main()
{
	map<string, string>dict;
	dict.insert(pair<string, string>("一", "one"));
	dict.insert(pair<string, string>("二", "two"));
	dict.insert(pair<string, string>("三", "three"));
	dict.insert(make_pair("四", "four"));//这里和上面三个是等价的写法
	dict["五"] = "five";//插入+修改
	dict["六"];
	dict.insert(make_pair("六", "six"));//不能修改,因为这个key值存在
	for (auto& e : dict)
	{
		cout << e.first << ":" << e.second << " ";
	}
	cout << endl;
	dict["六"] = "six";
	for (auto& e : dict)
	{
		cout << e.first << ":" << e.second << " ";
	}	
	return 0;
}

在这里插入图片描述
在这里插入图片描述
这里和operator[]的区别就是,如果不存在会抛出一个异常。
在这里插入图片描述
这里第二个参数只需要一个key,不需要pair。

multimap

这里和map最大的区别就是不提供operator[],因为一棵树当中会有多个相同的key,所以没必要存在operator[]。还有就是find会中序遍历查找,找到的第一个就是。

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

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

相关文章

【JVM】JVM之执行引擎

文章目录前言名词解释机器码指令指令集汇编语言高级语言字节码虚拟机&物理机前端编译器&后端编译器JVM之执行引擎执行引擎是如何工作的&#xff1f;解释器即时编译器&#xff08;JIT&#xff09;分层编译策略虚拟机执行模式热点代码&探测方式1&#xff09;方法调用…

Android 屏蔽锁屏界面上的通知显示

一. 前言 [定制需求描述]:在插入SD后, 锁屏状态下&#xff0c; 去掉提示“SD卡可用于传输照片和媒体文件” 需求拆解: 要求正常显示在SystemUI下拉状态栏, 只需要屏蔽在锁屏状态下的通知. 二. 发送通知 首先来找找这个字符串"可用于传输照片和媒体文件" 是在/f…

buuctf_随便注

根据题目猜测这是一道SQL注入的题目输入一个单引号触发报错&#xff0c;根据报错信息得知闭合条件就是一对单引号继续构造表达式&#xff0c;得出一共包含两个回显位构造表达式求出当前数据库的名称&#xff0c;但是根据回显数据和实践来看&#xff0c;此题是对select进行了过滤…

【软件设计师12】数据流图DFD

数据流图DFD 必考下午第一道大题&#xff01;&#xff01;&#xff01; 基本概念、数据字典、数据平衡原则 1. 基本概念 顶层图是系统&#xff0c;再看中间跟外部数据的交换流不变&#xff0c;内部细化&#xff0c;最底层图进一步细化 数据存储在题干描述时&#xff0c;要么…

一文弄清-BP的过拟合与validationCheck

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com BP神经网络的训练经常会遇到过拟合的情况&#xff0c;导致模型在训练效果上很好但预测效果差 正因如此&#xff0c;matlab工具箱引入validationCheck来防止BP神经网络走向过拟合 本文介绍过拟合是…

SOTIF 预期功能安全ISO21448介绍、功能安全标准ISO26262 与若干安全标准的适用范围和开发流程映射

SOTIF 预期功能安全ISO21448介绍、功能安全标准ISO26262 与若干安全标准的适用范围和开发流程映射 ISO 21448 中规定了预期功能安全的设计开发流程图&#xff0c; 如下图所示。首先从 第 5 条出发&#xff0c; 进行规范和设计。该部分是将进行整车级、 系统级、 组件级等功能规…

快速了解Depop注册新方法,轻松一分钟入驻

东哥我是在几个月前第一次认识depop这个平台&#xff0c;原因是当时主要是让手底下的员工去操作&#xff0c;团队毕竟涉及到的平台都比较多&#xff0c;我就没那么多精力放在depop上&#xff0c;但却意外发现这个平台给我们带来很不错的业绩&#xff01;所以东哥今天打算给大家…

阿里p8大牛三年整理出全网最全的5万字的《Java核心知识手册》

利用空余时间整理了一份《Java核心知识手册》&#xff0c;初衷也很简单&#xff0c;就是希望在面试的时候能够帮助到大家&#xff0c;减轻大家的负担和节省时间。 前段时间&#xff0c;朋友圈分享了这份这份面试手册的初稿&#xff0c;在几位同学的提议下&#xff0c;对手册进…

线程夯死的排查及解决

最近做的业务一直是和第三方交互的业务&#xff0c;为了加快速度&#xff0c;基本上都是采用多线程&#xff0c;然而时不时总是发生一些推送任务莫名的卡死&#xff0c;知道前几天的一次发现&#xff0c;让我开始了线程的排查之路&#xff0c;希望对大家的有一定的启发和借鉴一…

使用Mybatis-plus在xml文件中实现自己定义的sql逻辑

1、创建数据库表(前提安装配置好Mysql&#xff0c;并且会使用) DROP TABLE IF EXISTS USER; CREATE TABLE USER (id BIGINT(20) NOT NULL COMMENT 主键ID,NAME VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) NUL…

【C51单片机】8-温湿度监测显示系统(LCD1602、温湿度传感器、IIC、OLED)

1.LCD1602概述 LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) //硬件接线 //电源 VSS -- GND VDD -- 5V //对比度 VO -- GND //控制线 RS -- P1.0 RW -- P1.1 E -- P1.4 //背光灯 A -- 5…

华为VRRP配置

拓扑图 PC1电脑配置 指定ip192.168.10.1 网关192.18.10.254 LSW1交换机配置 ge0/0/1 access &#xff0c;vlan10 ge0/0/2 trunk ge0/0/3 trunk <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Informa…

基础练习 闰年判断

def is_leap_year(year):if year % 4 0 and year % 100 ! 0 or year % 400 0:print("yes")else:print("no")if __name__ __main__:is_leap_year(int(input()))

题解,git的使用,MySQL与JDBC的使用(上)

题解 引入&#xff1a;tarjan算法&#xff0c;强连通分量&#xff0c;割点&#xff0c;割边&#xff0c;点双联通分量&#xff0c;边双联通分量 P4961 小埋与扫雷 思路&#xff1a;分别求出数字和空格相加即可 #include<iostream> using namespace std; const int X[8]…

图片与视频相关冷知识

目录 色彩的相关概念 色深 色相与饱和度 色调 冷色调与暖色调 色温 白平衡 白平衡偏移 色阶 色阶中的直方图 对比亮度 视频相关概念 像素数 分辨率 逐行扫描与隔行扫描 对比度 高对比度与低对比度 清晰度&#xff08;也称锐度&#xff09; 锐化 锐化与锐度…

果推断16--市场营销中资源分配问题的直接异质因果学习

题目&#xff1a;市场营销中资源分配问题的直接异质因果学习 Direct Heterogeneous Causal Learning for Resource Allocation Problems in Marketing 论文链接&#xff1a;https://export.arxiv.org/pdf/2211.15728v2.pdf 摘要&#xff1a;资源分配是市场营销中一类重要的决…

定点除法运算

目录 一、原码除法运算 1.原码比较法和恢复余数法 ⑴比较法 ⑵恢复余数法 2.原码不恢复余数法&#xff08;原码加减交替法&#xff09; 二、补码除法运算 1、够减的判断 2、上商规则 3、商符的确定 4、求新部分余数 5、末位恒置1 乘法的…

nssctf web入门(4)

这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;打算写10篇。 [ZJCTF 2019]NiZhuanSiWei [ZJCTF 2019]NiZhuanSiWei…

本周大新闻|微软IVAS 1.2预计24年交付;华为发布AR-HUD方案

本周XR大新闻&#xff0c;AR方面&#xff0c;IVAS 1.2版预计24年交付&#xff1b;苹果AR眼镜预计26年采用超透镜方案&#xff1b;苹果首款XR头显由和硕转立讯代工&#xff1b;一加展示新款AR眼镜原型&#xff1b;镭昱点亮单片全彩Micro-LED&#xff1b;苹果智能指环专利公布。 …

windows10 java 创建合约

a. 安装Nodejs 主要是方便使用npm 命令 并配置环境变量 b.使用 npm 可以便捷地安装Solidity编译器solcjs npm install -g solc c.找个目录 创建一个solidity文件 如 // SPDX-License-Identifier: GPL-3.0pragma solidity >0.8.2 <0.9.0;/*** title Storage* dev Store…