set和map

UVM概述及uvm_component和uvm_object(一) UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer 阅读详情

关联式容器

在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。

键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

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)
{}
};

set

①set是一个树形结构的容器,它会按一定次序存储数据(默认是升序),并且set会对数据进行去重操作
②前面有讲过二叉搜索树,set也是一个树形结构的容器。 set中只有一个value参数(与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放
value,但在底层实际存放的是由<value, value>构成的键值对。)
③set在底层是用二叉搜索树(红黑树)实现的。
④查找效率比较高,时间复杂度为O(logN^2)
⑤set中的元素不允许修改
在这里插入图片描述

unordered_set

unordered_set是特殊的set,与set不同的点在于,unordered_set不会对数据进行排序。
set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对
子集进行直接迭代。

具体看操作(解析部分操作)

insert

set进行insert操作,传入一个键值对,由于set存放的是<value,value>,所以只需要传一个value就足够了。 (value就是key)
返回值: 是一个pair类型,里面有两个参数。 第一个表示key所在位置的迭代器,第二个bool值表示是否插入成功。 也就是说,如果我们插入的这个值在set中已经存在,那么就会插入失败,返回的就是已存在key的迭代器,以及false值。 如果插入的这个值在set中不存在,那么就会找到恰当的位置插入进去,返回新插入节点的迭代器,以及true值。
在这里插入图片描述

当然,也可以以set一部分的迭代器区间来插入
在这里插入图片描述

find

set进行find也是传入一个键值对,传入value值就可以(value就是key)。返回对应key的迭代器,如果key不存在就返回set::end
在这里插入图片描述

count

set使用count时,依旧传入键值对,也就是value(key),接着count会去set找,传入的值是否存在,如果存在那么会返回1(因为set中数据存在也只会存在一个),不存在就返回0。
在这里插入图片描述

使用一下set吧

#include<set>  // 使用set需要包头文件
#include<iostream>
void TestSet1()
{
	// 用数组array中的元素构造set
	int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };  // 0到9之间的数字都有出现
	set<int> s(array, array + sizeof(array) / sizeof(array[0]));
	cout << s.size() << endl;
	// 正向打印set中的元素,从打印结果中可以看出:set可去重
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
	// 使用迭代器逆向打印set中的元素
	for (auto it = s.rbegin(); it != s.rend(); ++it)
		cout << *it << " ";
	cout << endl;
	// set中值为3的元素出现了几次
	cout << s.count(3) << endl;
}

结果:(set具有去重的功能)
在这里插入图片描述

map

①map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。(相较于set,map相当于kv模型,既有key又有value)。
②在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。 键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair
③在内部,map中的元素总是按照键值key进行比较排序的(同样默认是排升序)
④ map支持下标访问符,即在[]中放入key,就可以找到与key对应的value
但是set、multiset、multimap都是不支持[]访问的!!!
⑤map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))
⑥查找效率比较高,时间复杂度为O(logN^2)
⑦map中的key是唯一的,并且不能修改
在这里插入图片描述
在这里插入图片描述
key: 键值对中key的类型
T: 键值对中value的类型
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比
较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户
自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
空间配置器
注意:在使用map时,需要包含头文件。

map还有初始化列表的构造,具体的形式是这样的:
在这里插入图片描述

unordered_map

与unordered_set类似,就是在map的基础上多出一条规则,不对数据进行排序!

insert

在开始之前,我们先来看看map的几个参数
在这里插入图片描述

在这里插入图片描述
map的键值对为<key,value>,所以我们在传入参数时,是与set会有些许不同的。 我们传入参数可以用以下两种方法:

// 第一种
    m.insert(pair<string, string>("peach", "桃子"));
// 第二种
    m.insert(make_pair("banana", "香蕉"));

第一种是直接构造,第二种是用到了一个 make_pair的函数

make_pair

在这里插入图片描述
使用make_pair,直接将map的key和value传进去就可以了,这个函数会自动帮我们创建并返回我们需要的pair类型。

operator[]

首先operator[]map独有的一个操作。set、multiset、multimap都是不具备的!
在这里插入图片描述
在这里插入图片描述
operator的底层原理是利用的insert操作,insert与前面set的操作类似,只不过insert里面传入的参数是<key,value>,多了一个参数而已
在这里插入图片描述

insert返回值,是一个pair<iterator,bool>,我们通过调用first,就可以拿到对应key的迭代器,再通过迭代器,就可以访问到这个key所对应的value(通过迭代器.second获得)。
我们模拟一下底层就是这样的:
在这里插入图片描述
我们结合上图看,operator[]的返回值是一个key对应的value值。 operator因为底层是调用的insert,所以不管这个值key存不存在,insert返回过来的pair<iterator,bool>,iterator都是存在的。 所以我们再通过这个iterator就可以找到key对应的value值了。

具体看一看operator[]可以用来做些什么吧!

void test_map2()
{
	map<string, string> dict;
	dict.insert({ "string", "字符串" });

	// 插入(一般不会这么用)
	dict["right"];  //不存在,就插入

	// 插入+修改
	dict["left"] = "左边";  // 不存在,就进行插入,插入之后还要进行修改value值

	// "查找"
	cout << dict["string"] << endl; //因为返回的是value值,如果存在就打印得出来结果

	// 修改
	dict["right"] = "右边";  // 已经存在,这里的操作就是直接进行修改
}

我们再提及一个点,我们要注意map的operator[]和vector中operator[]作用是完全不同的。

vector中是以下标去访问数据,而map中实际是去插入,或者进行修改以及查找,并不是以下标去对应访问的!

其他的操作与set类似,这里就不再过多叙述!
那么接下来,我们还是来看看map操作的具体使用

map的具体使用

#include <string>
#include <map>
void TestMap1()
{
	map<string, string> m;
	// 向map中插入元素的方式:
	// 1.将键值对<"peach","桃子">插入map中,用pair直接来构造键值对
	m.insert(pair<string, string>("peach", "桃子"));
	// 2.将键值对<"peach","桃子">插入map中,用make_pair函数来构造键值对
	m.insert(make_pair("banana", "香蕉"));
	cout << m.size() << endl;


	// 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列
	for (auto& e : m)
		cout << e.first << "--->" << e.second << endl;
	cout << endl;
	// map中的键值对key一定是唯一的,如果key存在将插入失败
	auto ret = m.insert(make_pair("peach", "桃色"));
	if (ret.second)
		cout << "<peach, 桃色>不在map中, 已经插入" << endl;
	else
		cout << "键值为peach的元素已经存在:" << ret.first->first << "--->" << ret.first->second << " 插入失败" << endl;


	// 删除key为"apple"的元素
	m.erase("apple");
	if (1 == m.count("apple"))  //count的使用
		cout << "apple还在" << endl;
	else
		cout << "apple被吃了" << endl;
}
void test_map3()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
		"苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };
	map<string, int> countMap;  // map用来计数
	for (auto& e : arr)
	{
		auto it = countMap.find(e);  // find的使用  没找到就会返回map::end
		if (it != countMap.end())   //找到就进入循环,让对应key的value值++
		{
			it->second++;
		}
		else   // 如果这个key本身还不存在,那我们就进行插入
		{
			//countMap.insert({ e, 1 });
			countMap.insert(make_pair(e,1));
		}
	}

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

multiset和multimap

multiset中的元素不能修改。 multimap中的key也同样不能修改,但value可以修改。

set和map都会进行去重的操作,而multiset和multimap就是在set和map的基础上不对数据进行去重的操作。 其他的都是相同的,multimap和map还有一个不同的点在于multimap不能使用operator[]。
multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以重复的。

同样用实例看看区别:

void test_map3()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
		"苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };
	map<string, int> countMap;
	for (auto& e : arr)
	{
		auto it = countMap.find(e);
		if (it != countMap.end())   //没找到就会返回npos
		{
			it->second++;
		}
		else
		{
			//countMap.insert({ e, 1 });
			countMap.insert(make_pair(e,1));
		}
	}

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

可以看到结果是没有进行去重操作的: 对应的水果数量都不为1
在这里插入图片描述

eCognition易康面向对象分类批量选择样本,批量导出shp 可以的,使用这个工具条最右边那个三角尺manual editing toolbar,这是用来直接指定类别的,咱们可以拿它选完以后把指定的类别转成训练样本。另一个好处是,这个选出来的样本可以直接导出成shp,但select sample是不可以的,只能导出TTAMask也就是栅格掩膜。如果要导出shp,要在转之前导出。中间那条有点点的红线就是我的鼠标轨迹,只要碰到的对象就会全部选中,然后一点3的那个按钮就直接全部划分为林地了,十分丝滑。在弹出来的工作条里,首先选择你的类别,比如这里选一个forest。 阅读详情

相关推荐

【AWS】创建aws云服务器EC2实例

本文介绍了如何创建aws的EC2云服务器,并介绍了如何使用Xshell远程连接上云服务器

Marcos921的博客 2500

C++——map和set

C++、map和set。

2303_78442132的博客 1907

PLL Performance,Simulation and Design 4th学习笔记——Chapter1

Chapter1:基本PLL概述 VCO:Voltage-Controlled Oscillator压控振荡器,对于给定的一个输入电压,输出特定频率的振荡信号。 PLL:Phase-Locked Loops锁相环,输出特定频率,特定相位的振荡信号。 基本PLL操作和术语 基本模块 基本模块 输入 输出 传输函数 说明 XTAL - 参考频率ϕref\phi_{ref}ϕref​ - 稳定的晶振提供输入参考频率(这里用相位,便于理解鉴相器) R Counter ϕref\phi_{ref

张硕的博客 1550

Set 和 Map 的区别

Set和Map的区别

努力学习前端的小白 2万+

五大经典遥感数据集对比:LoveDA、Potsdam、Toronto、Vaihingen、Massachusetts Roads选哪个?

本文深度对比了LoveDA、Potsdam、Vaihingen、Toronto和Massachusetts Roads五大经典遥感数据集。针对城市监测、道路提取、土地分类等不同任务,从分辨率、标注质量、数据规模及场景多样性等核心维度进行分析,为研究者根据项目目标、硬件条件与应用场景选择最合适的遥感数据集提供决策指南。

weixin_29057065的博客 236

Joern实战:从代码导入到Python分析的全流程避坑指南(附常见错误解决方案)

本文详细介绍了Joern静态分析工具从代码导入到Python分析的全流程实践指南,包括环境配置、代码导入技巧、数据库服务优化、Python交互分析及性能调优等关键步骤。特别针对常见错误提供了实用解决方案,帮助开发者高效进行代码安全分析和漏洞挖掘。

weixin_28309571的博客 138

Map和Set的封装

Map和Set底层(红黑数)封装

m0_69323023的博客 2313

告别示教器!用C#和ABB PC SDK 6.08打造你的第一个Windows机器人控制台(附完整连接代码)

本文详细介绍了如何使用C#和ABB PC SDK 6.08开发Windows机器人控制台应用,实现无示教器的机器人控制。从环境配置、SDK引用到机器人发现、连接及状态监控,提供了完整的代码示例和架构设计建议,帮助开发者快速掌握上位机控制技术。

weixin_29758911的博客 319

map和set的使用

set的模板参数template <class T,//键值类型class Compare = std::less<T>,/仿函数用来控制顺序class set;1.T就是键值的类型。2.在默认情况下,set支持的是小于比较,可以自己写仿函数。3.set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。4.一般后面两个参数我们是用不到的。5.set的底层是红黑树,增删查的效率是O(logN)(键值不能修改)。

prettyxian的博客 1182

解决Docker拉取镜像报错:Get https://registry-1.docker.io/v2/: 报错

解决Docker拉取镜像报错: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection问题描述Get "https://registry-1.docker.io/v2/"是docker官方的镜像源,下载很慢的,一般会自己指定国内映射的加速镜像源。

qq_33650333的博客 4170

GD32重映射实战:从部分映射到完全映射的配置解析

本文深入解析GD32微控制器的重映射功能,以定时器1的PWM通道为例,详细阐述了从部分映射到完全映射的实战配置流程。文章重点介绍了AFIO模块的核心作用、配置寄存器操作以及关键的避坑指南,旨在帮助开发者灵活优化PCB布局并解决引脚资源冲突,从而高效利用芯片外设功能。

k6l7m8n9的博客 692

Map 和 Set

Map 和 Set

Excuse_lighttime的博客 4749

linux v3h平台开发系列详解(GMSL摄像头篇):1.11 解串器MIPI 1.5G高速率特殊deskew配置

解串器max96712 deskew配置

xian18809311584的博客 1774

【C++】map和set的使用

目录1. 序列式容器和关联式容器2. set系列的使用2.1 set和multiset参考文档 - C++ Reference2.2 set类的介绍2.3 set的构造和迭代器2.4 set的增删查2.5 insert和迭代器遍历使用样例:2.6 find和erase使用样例:2.7 multiset和set的差异2.8.lower_bound和upper_bound练习:2.8 349. 两个数组的交集 - 力扣(LeetCode)2.9 142. 环形链表 II - 力扣(LeetCode)3. map

2401_82610555的博客 2291

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《C++》Map和Set:小白也能懂的解析

C++中map和set讲解

Maysheeo的博客 1165

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Map和Set

本篇文章将讲解数据结构的最后一个集合类:Map和Set。掌握 Map/Set 实际实现类HashMap/TreeMap/HashSet/TreeSet 的使用以及背后的哈希表的原理和简单实现。

matexiang的博客 1883

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C++】map和set的介绍以及用法

我们来看看以下几个有关于set的要点:1.set是用来存储唯一元素的容器,且按照一定的顺序进行排列。2.set中不允许出现重复的元素,其本质是负责排序+去重。3.set在底层是用红黑树来实现的。4.set的比较默认按照小于进行。5.set的正向迭代器遍历为升序序列,反向迭代器为降序序列。6.在set类中的其内容可以进行删除,但不支持修改。7.set中查找某个元素的时间复杂度为logN。map是C++中STL的一个关联式容器,它是以键值对。

2301_81044829的博客 1988

【C++】map和set封装

map和set的知识我们学习了,模拟实现我们已经实现了AVL树和红黑树。熟练知识点为map和set的使用提供了前提,手撕AVL树和红黑树让我了解到map和set的底层如何实现,有了知识点和两树的模拟铺垫,那我们该如何封装map和set呢?⭐主体​class setprivate:class mapprivate:{}//普通迭代器的时候,它是拷贝构造//const迭代器的时候,它是构造,支持用普通迭代器构造const迭代器{}💫解引用操作作用:返回对应结点数据的引用。

AAlykk的博客 1262

了解map和set

了解map和set的使用!!!

小八哥 904

map和set

在认识map和set之前,关于容器,有两个重要的:按照元素插入的顺序保存数据,关注元素的顺序和位置,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,元素是按他们在容器中的存储位 置来顺序保存和访问的,如string、vector、list、deque、array、forward_list等:通过关键字来存储和访问元素,关注的是元素之间的关系,逻辑结构通常是⾮线性结构两个位置有紧密的关联关系,如果交换顺序,它的存储结构就被破坏了。

2302_81258662的博客 1745

Set和Map

Map和Set(C++)详解

m0_69323023的博客 1403

Java Map和Set

HashMap是线程不安全的,因为采用了头插法,后面采用了尾插法变得安全了,ConcurrentHashMap是线程安全的,之后学到了线程就可以理解了。如果key是String,Person类型就不能除以数组的长度了,该怎么找到对应的下标呢?4. 扩容之后需要重新哈希,因为数组长度变了,要重新计算节点存放的位置。如果频率相同放入堆中要使用大根堆,要让love排在i的前面。5. 遍历哈希数组中每个数组元素,都要重新计算节点位置。cur是某个节点的左边。cur是某个节点的右边。要删除的节点是cur。

的博客 1990

【Java】Map和Set

Map.Entry 是Map内部实现的用来存放键值对映射关系的内部类,该内部类中主要提供了的获取,value的设置以及Key的比较方式。可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,下面介绍的Map和Set是一种适合动态查找的集合容器。6.Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号。

2301_78373304的博客 1352
上一篇: 二叉搜索树相关
下一篇: 文件IO~~软硬链接及动静态库
没事多喝水zz
博客等级 码龄3年 284粉丝 24原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值