【C++】map和set的介绍+使用

2023-10-31

前言:

    我们前面一起学习了二叉搜索树,这便是为了引入本章我们所学的map和set容器。map和set的底层实现就和二叉搜索树有关...

目录

(一)键值对的引入

(1)关联式容器

(2)键值对

(二)set

(1)set的介绍

(2)set的使用

set的插入:

 set的查找:

set的删除:

 (3)multiset的介绍+使用

(三)map

(1)map的介绍

(2)map的使用

map的插入:

std::map::operator[]的使用(*重点):


(一)键值对的引入

(1)关联式容器

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

通常我们学习的都是树状结构的关联式容器

根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结
构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使
用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一
个容器。

总结:

序列式容器:

  • 在前期我们所学过的STL容器中,例如:string,vector,list,queue…,这些序列式容器中我们不难发现,其存储的都是 C++ 基本数据类型(诸如 int、double、float、string等)或使用自定义类型(结构体)的元素。

树状结构的关联式容器:

  • 关联式容器则和序列式容器有很大区别,关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。除此之外,序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排序。

 

(2)键值对

关联式容器存放的是键值对,那么键值对是什么呢?

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

 它实际上就是一个类模板,用来表示具有一 一对应关系的一种结构。

STL源码库给出的源代码如下:

 

(二)set

(1)set的介绍

使用 set 容器,必须引入该头文件#include < set >

set的使用文档

T: set中存放元素的类型,实际在底层存储<value, value>的键值对。
Compareset中元素默认按照小于来比较
Allocset中元素空间的管理方式,使用STL提供的空间配置器管理

 介绍:

  • 1. set是按照一定次序存储元素的容器
  • 2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  • 3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  • 4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代
  • 5. set在底层是用二叉搜索树(红黑树)实现的。

注意:
  • 1. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放 value,但在底层实际存放的是由<value, value>构成的键值对
  • 2. set中插入元素时,只需要插入value即可,不需要构造键值对。
  • 3. set中的元素不可以重复(因此可以使用set进行去重)。
  • 4. 使用set的迭代器遍历set中的元素,可以得到有序序列
  • 5. set中的元素默认按照小于来比较
  • 6. set中查找某个元素,时间复杂度为:$log_2 n$
  • 7. set中的元素不允许修改

(2)set的使用

set的插入:

和很多容器一样,set设置了插入的接口,但是set的插入是有额外的功能性的! 

我们试用下面的代码:

void test_set1()
{
	set<int> s1;
	s1.insert(2);
	s1.insert(6);
	s1.insert(2);
	s1.insert(3);
	s1.insert(3);
	s1.insert(5);
	s1.insert(8);
	s1.insert(8);
	s1.insert(6);
	s1.insert(7);

//两种迭代打印的方法::
	set<int>::iterator it = s1.begin();
	while (it != s1.end())
	{
		// 搜索树不允许修改key,可能会破坏搜索的规则
		//*it1 += 1;
		cout << *it << " ";
		++it;
	}
	cout << endl;


	for (auto e : s1)
	{
		cout << e << " ";
	}

}

输出结果:

 set实现了去重和排序

  • 有重复的不插入
  • 默认按照升序排列

同样的迭代器的使用方式也一样,只是这里的const迭代器和普通迭代器都是一样的,都不支持修改,原因是如果对二叉搜索树进行修改的话,很有可能会导致整棵树的结构被打乱,所以不支持修改。


 set的查找:

 应用代码:
 

void test_set2()
{
	// 排序 + 去重
	set<int> s1;
	s1.insert(2);
	s1.insert(6);
	s1.insert(2);
	s1.insert(3);
	s1.insert(3);
	s1.insert(5);
	s1.insert(8);
	s1.insert(8);
	s1.insert(6);
	s1.insert(7);
	int x;
	while (cin >> x)
	{
		/*auto ret = s1.find(x);
		if (ret != s1.end())
			cout << "在" << endl;
		else
			cout << "不在" << endl;*/

		if (s1.count(x))
			cout << "在" << endl;
		else
			cout << "不在" << endl;
	}
}

这里find的用法和算法库里的一样,但是为什么要再在set中创立一个呢?

set自带的查找和算法库中的查找有什么区别

  • set自带的查找是利用了搜索树的特点,查找时间复杂度为〇(logN)
  • 如果用算法库中的查找则是通过暴力查找的方式进行的,时间复杂度为〇(N)

set的删除:



		set<int> s;
		s.insert(4);
		s.insert(5);
		s.insert(2);
		s.insert(1);
		s.insert(1);
		s.insert(3);
		s.insert(2);
		s.insert(1);

		s.erase(3);//直接给值删除

		for (auto e : s)
		{
			cout << e << " ";
		}
		cout << endl;

		int x;
		while (cin >> x)
		{
			set<int>::iterator pos = s.find(x);
			if (pos != s.end())
			{
				s.erase(pos);//迭代器删除
				cout << "删除" << x << "成功" << endl;
			}
			else
			{
				cout << x << "不在set中" << endl;
			}

			for (auto e : s)
			{
				cout << e << " ";
			}
			cout << endl;
		}
	

 

删除接口也没什么可以过多介绍的了,还有size、empty、clear等接口和我们之前学的容器接口用法一样,大家可以自己实践一下!

 (3)multiset的介绍+使用

set会自动实现去重的操作,那我们只想拥有排序等相关的操作,而不想去重,这里STL也为我们提供了multiset容器。

介绍:

  • 1. multiset是按照特定顺序存储元素的容器,其中元素是可以重复的
  • 2. 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成 的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除
  • 3. 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序。
  • 4. multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
  • 5. multiset底层结构为二叉搜索树(红黑树)。


用法:


void test_set3()
{
	multiset<int> s1;
	s1.insert(1);
	s1.insert(1);
	s1.insert(2);
	s1.insert(3);
	s1.insert(3);
	s1.insert(4);
	s1.insert(4);
	s1.insert(4);
	s1.insert(5);

	multiset<int>::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}

	cout << endl;

	auto ret = s1.find(1);
	cout << *ret << endl;
	while (ret != s1.end() && *ret == 1)
	{
		cout << *ret << " ";
		++ret;
	}
	cout << endl;
	cout << s1.count(1) << " ";
	cout << s1.count(5) << " ";

}

输出结果:

 

 这里我们看到,可以打印出重复的数据了,此时count的作用可以计数了,不需要局限于和find同等的用处。

(三)map

(1)map的介绍

使用 map 容器,必须引入该头文件#include < map >

map的使用文档

key: 键值对中key的类型
T: 键值对中value的类型
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比
较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户
自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
空间配置器
介绍:
  • 1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
  • 2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型 value_type绑定在一起,为其取别名称为pair: typedef pair<const key, T> value_type;
  • 3. 在内部,map中的元素总是按照键值key进行比较排序的。
  • 4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序
  • 对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  • 5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
  • 6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

(2)map的使用

map的插入:

其实map的操作也和其他容器的操作是一样的,但由于map中存放的是键值对,所以我们以插入为例来介绍如何使用:

void test_map1()
{
	map<string, string> dict;
	//匿名对象的好处
	dict.insert(pair<string, string>("sort", "排序"));

	//不用匿名对象
	pair<string, string> kv("insert", "插入");
	dict.insert(kv);

	//make_pair是函数模板
	dict.insert(make_pair("left", "左边"));

	//可以这么写但是别这么用(隐式类型的转换) -- C++11再讲
	dict.insert({ "right", "右边" });

	//map的遍历
	map<string, string>::iterator it = dict.begin();
	while (it != dict.end())
	{
		//cout << *it << endl;//it->operator*() -- C++不支持返回两个值
		//cout << (*it).first << ":" << (*it).second << endl;

		cout << it->first << ":" << it->second << endl;

		it++;
	}
	cout << endl;

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

我们这里使用匿名对象配合insert使用非常方便,库中也给了make_pair函数模板来表示键值对的创建。

 因为C++不支持返回两个值,所以我们这里用到了pair,通过pair的first和second,即可访问到两个值。

 

同时,map迭代器的使用方法和其他容器迭代器的使用方法一样,这是STL设计时为了方便使用,所采用的高维度泛型设计。

Key_value模型中,修改不能修改key,但是可以修改value。


std::map::operator[]的使用(*重点):

引入:

我们利用map来统计各个水果出现的次数:

通过查找来挨个遍历查找统计个数

void test_map2()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果",
					 "西瓜", "苹果", "香蕉", "苹果", "香蕉" };

	map<string, int> countMap;
	for (auto& str : arr)
	{
		map<string, int>::iterator it = countMap.find(str);
		if (it != countMap.end())
		{
			it->second++;
		}
		else
		{
			countMap.insert(make_pair(str, 1));
		}
	}
}

注意:

  • 只要是一对一对的值都可以用pair
  • first和second是不允许被修改的

insert的返回值是一个pair,pair的first是一个迭代器(如果插入成功了指向新插入的位置,如果插入失败了,则返回已经存在的结点的位置),pair的second的一个bool值,插入成功是返回true,失败是返回false。

所以我们还可以通过返回值来统计个数

但是map库中给出 operator[ ] ,其实他的应用会让上述郭晨改变的更简单易懂!

  • 在之前学习的容器中,operator[]都有随机访问的意思,这里的方括号已经没有了随机访问的意思
  • 这里operator[]的参数是key,返回值是value的引用

 

其中可以对文档中的最后一句对此函数的调用等效于:

我么能深入探讨一下,理解如下:

所以operator[ ]的参数是key,返回值是value的引用!!!

我们可以用operator[ ]来统计次数:

 

因为返回的是value的引用所以,可以修改,这样一来,operator[]兼顾了两个功能:插入 + 修改

同样当map需要插入的时候,也就有了如下的写法:


void test_map2()
{
	map<string, string> dict;
	//dict.insert(pair<string, string>("sort", "排序"));
	dict.insert(make_pair("sort", "排序"));
	dict.insert(make_pair("string", "字符串"));
	dict.insert(make_pair("count", "计数"));
	dict.insert(make_pair("count", "(计数)"));//插入失败


	dict["left"] = "左面";//插入+修改
	dict["right"];//插入
	dict["count"] = "(计数)";//修改
	cout << dict["count"] << endl; // 查找

	//map<string, string>::iterator dit = dict.begin();
	auto dit = dict.begin();
	while (dit != dict.end())
	{
		//cout << (*dit).first << ":" << (*dit).second << endl;
		cout << dit->first << ":" << dit->second << endl;

		++dit;
	}
	cout << endl;
}

operator[ ]的使用不仅可以简化计数等,还可以兼顾插入、修改、查找等作用!大家重点理解!

感谢您的阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】map和set的介绍+使用 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 新能源汽车的充电、电池包的组成、充电的设备

    一 新能源汽车的电池包 1 电动汽车电池包的组成 电动汽车的电池包主要由电池单体 模组构成 电池单体指的是单个独立的锂电池 将多个电池单体组合在一起就成了模组 再把多个模组组合起来最终构成电池包 不过这里有个特例 那就是比亚迪的刀片电池 由
  • Java-抽象类和接口的区别及其使用场景

    一 抽象类 一直不太理解为什么要使用抽象类 实际所有使用抽象类的实现都可以用普通类代替 昨晚突发奇想 把这块深入的啃一下 看到一个很好的例子 由此例子做进一步剖析 比如公司有工程师 管理员 二者都有姓名 name 工号 id 工资 pay
  • 1-Cesium中文教程-快速开始

    快速开始 这是一个基于Cesium 应用真实地理数据构建3D应用程序的快速开始上手的教程 你将学习到如何构建Cesium的web应用页面 像这样 第一步 创建一个账户并获得一个token Cesium ion 是一个开放的数据流平台 托管保
  • 图解 SQL,这也太形象了吧!

    点击上方 码农突围 马上关注这里是码农充电第一站 回复 666 获取一份专属大礼包真爱 请设置 星标 或点个 在看 来源 r6d cn pQFm 本文介绍关系数据库的设计思想 在 SQL 中 一切皆关系 在计算机领域有许多伟大的设计理念和思
  • system.exit(0)和system.exit(1)区别

    1 查看java lang System的源代码 我们可以找到System exit status 这个方法的说明 代码如下 Terminates the currently running Java Virtual Machine The
  • 单击删除所在行

  • MySQL--事务回滚机制与原理

    事务回滚机制 其实 讨论MySQL的事务回滚机制 也就是在说MySQL的事务原子性是如何实现的 关于事务之前文章中有过简单介绍 所谓原子性 就是指一个事务是一个不可分割的工作单位 其中的操作要么都做 要么都不做 如果事务中的一个sql语句执
  • 自旋锁(spin lock)与互斥量(mutex)的比较——多核编程学习笔记2

    自旋锁是一种非阻塞锁 也就是说 如果某线程需要获取自旋锁 但该锁已经被其他线程占用时 该线程不会被挂起 而是在不断的消耗CPU的时间 不停的试图获取自旋锁 互斥量是阻塞锁 当某线程无法获取互斥量时 该线程会被直接挂起 该线程不再消耗CPU时
  • 概率论知识点--上半学期

    第一章 概率论的基本概念 素材来源于B站猴博士 如有侵权立即删除 文章仅供学渣享用 大佬请移步 这里大部分是初中学的 引入了很少的几个概念 P A overline A A 1 P A 意思就是一件事的逆 一定等于一减这件事 P
  • 重装VMware后,导入保存在硬盘上的虚拟机系统,报错:不存在功能misc.rsba_no,但实际情况下应该存在。

    主机重装系统后 重装VMware 用新安装的VMware打开硬盘上的虚拟机系统文件 报错 不存在功能 misc rsba no 但实际情况下应当存在 模块 FeatureCompatLate 启动失败 未能启动虚拟机 是因为 iso 文件找
  • 数据结构:10大经典排序

    排序 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 堆排序 8 计数排序 9 桶排序 10 基数排序 1 冒泡排序 冒泡排序 include
  • uni-app实战之社区交友APP(1)项目介绍和环境搭建

    文章目录 前言 一 项目介绍 二 环境搭建和创建项目 1 开发环境搭建 2 创建uni app项目 三 多端调试环境搭建 1 安卓手机调试配置 2 iOS真机调试配置 3 微信小程序调试配置 4 支付宝小程序调试配置 总结 如需查看本项目实
  • 微信小程序生成二维码

    1 复制 weapp qrcode js QR Code Generator for JavaScript Copyright c 2009 Kazuhiko Arase URL http www d project com License
  • flutter 的像素尺寸

    一般我们在android ios中都有自己的尺寸 如 dp pt 但是在flutter中写尺寸是没有单位的 如 SizedBox height 736 width 375 child Container color Colors light
  • 推荐一个超好用的视觉算法可视化分析工具

    First of all 先甩个项目github链接 https github com aiyojun cv algo analysis 如果觉得不错的给个star吧 鉴于视觉软件的开发成本太高 所以本人基于历史经验写了一个超级方便的可视化
  • vue项目编译打包到服务器,vue项目打包部署到服务器报错

    报错如下 webpack prod配置如下 const webpack require webpack const HtmlWebpackPlugin require html webpack plugin const ExtractTex
  • 【Linux基础IO之 内存文件操作】

    目录 前言 一 引入 C语言中的文件操作 系统文件操作 open 位图 权限 close write read lseek C语言中的文件操作函数与系统文件操作函数的联系 三 文件描述符 1 文件描述符是什么 2 文件缓冲区 再谈重定向 四
  • 虚拟机大小(1)

    2017 03 22 昨天也是弄了很久的虚拟机大小 这部分 我觉得还是应该从镜像的虚拟化角度来考虑 首先 我明白 分配出来的虚拟机大小 他当时分区的一些内容 都是跟最初制作镜像的时候相关的 因为这部分是写入到景象的磁盘里面去的 所以已经固化
  • (一)LTspice简介

    文章目录 前言 一 举例 1 1 RC滤波 1 2 仿真结果 二 软件安装 总结 前言 LTspice 是一款高性能SPICE仿真器软件 包括原理图捕获图形界面 可探测原理图以产生仿真结果 通过LTspice内置波形查看器轻松探索 与其他S
  • 【C++】map和set的介绍+使用

    前言 我们前面一起学习了二叉搜索树 这便是为了引入本章我们所学的map和set容器 map和set的底层实现就和二叉搜索树有关 目录 一 键值对的引入 1 关联式容器 2 键值对 二 set 1 set的介绍 2 set的使用 set的插入