map与set容器常见操作详解(含示例代码及注意事项)

news2024/11/23 15:52:37

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉 ————————————————

文章目录

    • 文章简介:
    • 一.set的介绍
        • set文档介绍总结:
        • set的使用
          • set原型:
          • 构造函数
          • 插入操作
          • 删除操作
          • 寻找操作
          • lower_bound AND upper_bound
    • 二.关联式容器
    • 三.map的介绍
        • map文档介绍总结
        • map的使用
          • map原型:
          • 构造函数
          • 插入操作
          • 删除操作
          • 寻找操作
          • operator[ ]详解
    • 四.multiset与multimap

文章简介:

通过阅读这篇文章,可以全面了解C++中的map与set容器,掌握它们的基本用法和常见操作,从而在实际编程中更加灵活地运用这两个容器。

一.set的介绍

文档链接:link

set文档介绍总结:

1.set是按照一定次序存储元素的容器,在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
2.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中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n

  7. set中的底层使用二叉搜索树(红黑树)来实现。

set的使用
set原型:

在这里插入图片描述
第一个模板参数class T,T为存储的的数据类型;
第二个是控制比较逻辑的,默认是升序,改变逻辑为greater为降序;
第三个内存池,申请空间;

构造函数

在这里插入图片描述
常用构造
1.支持用容器的一个迭代器区间构造

2.支持用另一个set去构造

代码演示:

int main()
{
	vector<int> v = { 11,22,1,5,2,8,6,4,9 }; 
	list<int> lt = { 11,22,1,5,2,8,6,4,9 };

	set<int> s(v.begin(), v.end());       //迭代器区间构造
	set<int> s2(lt.begin(), lt.end());    //迭代器区间构造
	set<int> s3(s2);                      //用s2去构造s3

	for (auto& e : s)
	{
		cout << e << ' ';
	}
	cout << endl;
	for (auto& e : s2)
	{
		cout << e << ' ';
	}
	cout << endl;
	for (auto& e : s3)
	{
		cout << e << ' ';
	}

	return 0;
}
//运行结果:
1 2 4 5 6 8 9 11 22
1 2 4 5 6 8 9 11 22
1 2 4 5 6 8 9 11 22
插入操作

在这里插入图片描述
解析:

(1)直接插入一个val,如果set里面已经存在这个值,则返回当前的iterator,bool返回false;
如果set里面没有该val,则插入val,并返回新插入的val的iterator,bool返回true;
(2)在postition位置插入val,如果set里面没有该值,则插入,返回新插入的val的iterator;
否则返回已经存在的val的iterator;
(3)将一个迭代器区间的值插入,无返回值;

代码演示:

void settest2()
{
	vector<int> v = { 11,22,1,5,2,8,6,4,9 };
	set<int> s;
	set<int> s1;
	set<int> s2;


	s.insert(20);                      //直接插入一个val
	s1.insert(v.begin(), v.end());    //迭代器区间构造
	s2.insert(s2.begin(),4);          //在position位置插入一个val

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

	for (auto& e : s1)
	{
		cout << e << ' ';
	}
	cout << endl;
	for (auto& e : s2)
	{
		cout << e << ' ';
	}
	cout << endl;

}

//运行结果:
20
1 2 4 5 6 8 9 11 22
4
删除操作

在这里插入图片描述
解析:

(1)删除position位置元素
(2)删除set中所有val,并返回删除了多少个;(set没有重复元素,返回的是1 or 0,对于multiset来讲,返回的个数可以是多个,因为multiset允许数据重复)
(3)删除一个迭代器区间

代码演示

void settest3()
{
	vector<int> v = { 11,22,1,5,2,8,6,4,9 };
	set<int> s(v.begin(), v.end());    //v初始化s

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


	s.erase(--s.end());           //删除第一个元素,删除迭代器位置的元素
	for (auto& e : s)            //end()是最后一个元素的下一个元素,所以要--;
	{
		cout << e << ' ';
	}
	cout << endl;

	int ret = s.erase(11);       //删除11,set里有,应该返回1     
	cout << ret << endl;         //打印返回值
	int ret2 = s.erase(100);     //删除100,set里面没有,应该返回0
	cout << ret2 << endl;        //打印返回值
	for (auto& e : s)
	{
		cout << e << ' ';
	}
	cout << endl;

	s.erase(s.begin(),s.end());    //删除迭代器区间的元素
	for (auto& e : s)
	{
		cout << e << ' ';
	}
	cout << endl;

}
//打印结果:
1 2 4 5 6 8 9 11 22
1 2 4 5 6 8 9 11
1
0
1 2 4 5 6 8 9

寻找操作

在这里插入图片描述
解析:

在set中寻找val,如果找到了返回该值的const迭代器,如果没有找到,则返回end();

代码演示:

void settest4()
{
	vector<int> v = { 11,22,1,5,2,8,6,4,9 };
	set<int> s(v.begin(), v.end()); 

	for (auto& e : s)
	{
		cout << e << ' ';
	}
	cout << endl;
	
	for (int i = 0; i < v.size(); i++)    //依次遍历v中元素
	{
		const auto& it = s.find(v[i]);    //找元素位置
		s.erase(it);                      //删除
		for (auto& e : s)                 //打印
		{
			cout << e << ' ';
		}
		cout << endl;
	}
}
//运行结果:
1 2 4 5 6 8 9 11 22
1 2 4 5 6 8 9 22
1 2 4 5 6 8 9
2 4 5 6 8 9
2 4 6 8 9
4 6 8 9
4 6 9
4 9
9

lower_bound AND upper_bound

在这里插入图片描述
在这里插入图片描述

解析:
lower_bound:

寻找val,如果存在该元素,则返回该位置的迭代器,如果不存在,则返回比val大的那一个元素的迭代器;

upper_bound:

寻找val,如果存在该元素,则返回比val大的那一个元素的迭代器,如果不存在,也返回比val大的那一个元素的迭代器;

代码演示:

void settest5()
{
	vector<int> v = { 11,22,1,5,2,8,6,4,9 };
	set<int> s(v.begin(), v.end());

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

	const auto& it = s.lower_bound(5);    //5存在  ,返回的是5的位置的迭代器
	cout << *it << endl;

	const auto& it1 = s.lower_bound(7);    //7不存在 ,返回的是比7大的呢一个元素的位置的迭代器
	cout << *it1 << endl;


	const auto& it2 = s.upper_bound(11);    //11存在 ,返回的是比11大的一个元素位置的迭代器
	cout << *it2 << endl;

	const auto& it3 = s.upper_bound(10);    //10不存在,返回的是比10大那一个元素位置的迭代器
	cout << *it3 << endl;

}
//运行结果:
1 2 4 5 6 8 9 11 22
5
8
22
11

二.关联式容器

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

键值对

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

三.map的介绍

map的文档链接:link

map文档介绍总结
  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通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
map的使用
map原型:

在这里插入图片描述

构造函数

在这里插入图片描述
解析:
常用的就是2与3

(2)用一个迭代器区间构造
(3)用另一个map去构造

代码演示

void maptest1()
{
	map<string, string> kv;
	kv["hello"] = "你好";
	kv["string"] = "字符串";
	kv["world"] = "世界";
	kv["apple"] = "苹果";
	kv["red"] = "红色";

	map<string, string>::iterator it = kv.begin();
	while (it != kv.end())
	{
		cout << it->first << ':' << it->second << ' ';
		++it;
	}
	cout << endl;

	map<string, string> kv2(kv.begin(), kv.end());      //迭代器区间构造
	map<string, string>::iterator it2 = kv2.begin();

	while (it2 != kv2.end())
	{
		cout << it2->first << ':' << it2->second << ' ';
		++it2;
	}
	cout << endl;  

	map<string, string> kv3(kv2);   //用另一个map去构造
	map<string, string>::iterator it3 = kv3.begin();
	while (it3 != kv3.end())
	{
		cout << it3->first << ':' << it3->second << ' ';
		++it3;
	}
	cout << endl;

}
//运行结果:
apple:苹果 hello:你好 red:红色 string:字符串 world:世界
apple:苹果 hello:你好 red:红色 string:字符串 world:世界
apple:苹果 hello:你好 red:红色 string:字符串 world:世界

插入操作

在这里插入图片描述

解析:

(1)直接插入一个val,如果set里面已经存在这个值,则返回当前的iterator,bool返回false;
如果set里面没有该val,则插入val,并返回新插入的val的iterator,bool返回true;
(2)在postition位置插入val,如果set里面没有该值,则插入,返回新插入的val的iterator;
否则返回已经存在的val的iterator;
(3)将一个迭代器区间的值插入,无返回值;

代码演示

void maptest2()
{
	map<string, string> kv;
	kv["hello"] = "你好";
	kv["string"] = "字符串";

	map<string, string> kv2;
	kv2.insert(make_pair("yellow", "黄色"));   //直接插入

	kv2.insert(kv.begin(), kv.end());    //将kv迭代器区间的元素插入

	kv2.insert(kv2.begin(), make_pair("red", "红色"));   //在position位置插入一个元素

	map<string, string>::iterator it1 = kv2.begin();
	while (it1 != kv2.end())
	{
		cout << it1->first << ':' << it1->second << ' ';
		++it1;
	}
	cout << endl;
}
//运行结果:
hello:你好 red:红色 string:字符串 yellow:黄色
删除操作

在这里插入图片描述

解析:

(1)删除position位置元素
(2)删除set中所有k,并返回删除了多少个;(map没有重复元素,返回的是1 or 0,对于multiset来讲,返回的个数可以是多个,因为multimap允许数据重复)
(3)删除一个迭代器区间

void maptest3()
{
	map<string, string> kv;
	kv["hello"] = "你好";
	kv["string"] = "字符串";
	kv["world"] = "世界";
	kv["apple"] = "苹果";
	kv["red"] = "红色";

	map<string, string>::iterator it1 = kv.begin();
	while (it1 != kv.end())
	{
		cout << it1->first << ':' << it1->second << ' ';
		++it1;
	}
	cout << endl;

	kv.erase("hello");                      //删除hello元素
	it1 = kv.begin();
	while (it1 != kv.end())
	{
		cout << it1->first << ':' << it1->second << ' ';
		++it1;
	}
	cout << endl;

	kv.erase(kv.begin());                     //删除一个迭代器位置的元素
	it1 = kv.begin();
	while (it1 != kv.end())
	{
		cout << it1->first << ':' << it1->second << ' ';
		++it1;
	}
	cout << endl;

	kv.erase(kv.begin(), kv.end());            //删除一个迭代器区间  全部删除
	it1 = kv.begin();
	while (it1 != kv.end())
	{
		cout << it1->first << ':' << it1->second << ' ';
		++it1;
	}
	cout << endl;
}
//运行结果:
apple:苹果 hello:你好 red:红色 string:字符串 world:世界
apple:苹果 red:红色 string:字符串 world:世界
red:红色 string:字符串 world:世界

寻找操作

寻找操作与set类似,就不讲解了,这里重点详解operator[ ]的操作;

operator[ ]详解

在这里插入图片描述

解析:

operator[ ]调用的是insert函数类实现的(其中使用的是返回值为pair<iteraotr,bool> 的insert函数)

insert函数的功能(前面讲解过):
功能:直接插入一个val,如果set里面已经存在这个值,则返回当前的iterator,bool返回false;
如果set里面没有该val,则插入val,并返回新插入的val的iterator,bool返回true;

operator[ ]功能:
如果待插入元素(k)已经存在,则返回已经存在的这个元素的迭代器指向的pair里面第二个值的引用;
如果待插入元素不存在,则先调用insert函数插入一个k ,返回这个元素的迭代器的第二个值的引用;

代码演示

void maptest4()
{
	map<string, int> kv;
	string arr[] = { "hello","red","blue","hello","apple","blue" };

	for (auto& e : arr)
	{
		kv[e]++;
	}

	auto it = kv.begin();
	while (it!=kv.end())
	{
		cout << it->first << '[' << it->second << ']' << endl;
		++it;
	}
}
//运行结果:
apple[1]
blue[2]
hello[2]
red[1]

四.multiset与multimap

multiset与set类似,只不过它允许val值可以重复;

注意:

  1. multiset中再底层中存储的是<value, value>的键值对
  2. mtltiset的插入接口中只需要插入即可
  3. 与set的区别是,multiset中的元素可以重复,set是中value是唯一的
  4. 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列
  5. multiset中的元素不能修改
  6. 在multiset中找某个元素,时间复杂度为 O ( l o g 2 N ) O(log_2 N) O(log2N)
  7. multiset的作用:可以对元素进行排序

举个栗子:

void multisetTest()
{
	multiset<int> ms;
	vector<int> v = { 19,2,3,6,3,2,8,19,8,10,6, };
	for (auto& e : v)
	{
		ms.insert(e);
	}
	for (auto& e : ms)
	{
		cout << e << ' ';
	}

}
//运行结果:
2 2 3 3 6 6 8 8 10 19 19

multimap与map类似,只不过它也是允许k值可以重复;

注意:

  1. multimap中的key是可以重复的;
  2. multimap中的元素默认将key按照小于来比较;
  3. multimap中没有重载operator[]操作;
  4. 使用时与map包含的头文件相同;

举个例子:

multimap

//multimap
void multismpapTest()
{
	multimap<string, int> kv;
	kv.insert(make_pair("apple", 1));
	kv.insert(make_pair("apple", 2));
	kv.insert(make_pair("apple", 3));
	kv.insert(make_pair("apple", 4));
	kv.insert(make_pair("apple", 5));

	auto it = kv.begin();
	while (it != kv.end())
	{
		cout << it->first << ':' << it->second << endl;
		++it;
	}
}//运行结果:
apple:1
apple:2
apple:3
apple:4
apple:5

map

//map
void multismpapTest()
{
	map<string, int> kv;
	kv.insert(make_pair("apple", 1));
	kv.insert(make_pair("apple", 2));
	kv.insert(make_pair("apple", 3));
	kv.insert(make_pair("apple", 4));
	kv.insert(make_pair("apple", 5));

	auto it = kv.begin();
	while (it != kv.end())
	{
		cout << it->first << ':' << it->second << endl;
		++it;
	}
}
//运行结果:
apple:1

本章完~

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

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

相关文章

【案例·增】一条insert语句批量插入多条记录

问题描述&#xff1a; 往MySQL中的数据库表中批量插入多条记录&#xff0c;可以使用 SQL 中的 ((), ()…)来处理 案例&#xff1a; INSERT INTO items(name,city,price,number,picture) VALUES(耐克运动鞋,广州,500,1000,003.jpg),(耐克运动鞋2,广州2,500,1000,002.jpg);规则…

C语言--编译和链接

1.翻译环境 计算机能够执行二进制指令&#xff0c;我们的电脑不会直接执行C语言代码&#xff0c;编译器把代码转换成二进制的指令&#xff1b; 我们在VS上面写下printf("hello world");这行代码的时候&#xff0c;经过翻译环境&#xff0c;生成可执行的exe文件&…

2. Java基本语法

文章目录 2. Java基本语法2.1 关键字保留字2.1.1 关键字2.1.2 保留字2.1.3 标识符2.1.4 Java中的名称命名规范 2.2 变量2.2.1 分类2.2.2 整型变量2.2.3 浮点型2.2.4 字符型 char2.2.5 Unicode编码2.2.6 UTF-82.2.7 boolean类型 2.3 基本数据类型转换2.3.1 自动类型转换2.2.2 强…

【详细讲解PostCSS如何安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

macOS Ventura 13.6.6 (22G630) Boot ISO 原版可引导镜像下载

macOS Ventura 13.6.6 (22G630) Boot ISO 原版可引导镜像下载 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 发布&#xff0c;同时带来了 macOS Ventru 13.6.6 安全更新。 macOS Ventura 13.6 及更新版本&#xff0c;如无特殊说明皆为安全更新&#xff0c;不再赘述。 本站…

MoneyPrinterTurbo搭建详细流程(Linux)及常见问题

先附上链接: MoneyPrinterTurbohttps://github.com/harry0703/MoneyPrinterTurboMoneyPrinterTurbo是一款合成视频的软件。 你只需要提供一个主题或者关键字,就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐,然后合成一个高清的短视频。 接下来讲解详细的搭…

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…

SQL-CRUD-2数据库实验

目录 第一关任务描述 相关知识 插入完整内容的行 插入选定内容的行 编程要求 测试说明 第一关代码 第二关任务描述 相关知识 删除表中的指定行 删除表中的所有行 编程要求 测试说明 第二关代码 第三关任务描述 相关知识 更新表中的指定行 编程要求 测试说明…

鸿蒙:搜索框组件Search

搜索框组件&#xff0c;适用于浏览器的搜索内容输入框等应用场景。 说明 该组件从API Version 8开始支持 子组件 无 接口 Search(options?: { value?: string, placeholder?: string, icon?: string, controller?: SearchController }) 参数: 参数名 参数类型 必…

61、服务攻防——中间件安全CVE复现K8sDockerJettyWebsphere

文章目录 K8sDockerWebSphere K8s k8s&#xff1a;简单来说&#xff0c;跟docker一样&#xff0c;是个容器系统。 k8s对外攻击面总结 常见漏洞&#xff1a;未授权访问、提权漏洞 Docker docker逃逸&#xff1a;1、由内核漏洞引起&#xff1b;2、由Docker软件设计引起&#x…

【Git】git status中文文件名编码问题解决

git status中文文件名编码问题解决 一、问题二、解决方法 一、问题 在默认配置下&#xff0c;查看文件状态&#xff0c;中文文件名在工作区状态输出&#xff0c;中文名不能正确显示&#xff0c;而是显示为八进制的字符编码。 PS D:\VS代码\Widget> git status On branch m…

TOP100-回溯(二)

4.39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制…

【计算机网络篇】数据链路层(4.2)可靠传输的实现机制

文章目录 &#x1f354;可靠传输的实现机制⭐停止 - 等待协议&#x1f5d2;️注意 &#x1f50e;停止 - 等待协议的信道利用率&#x1f5c3;️练习题 ⭐回退N帧协议&#x1f388;回退N帧协议的基本工作流程&#x1f50e;无传输差错的情况&#x1f50e;超时重传的情况&#x1f5…

GitHub开源项目权限管理-使用账号和个人令牌访问

1.打开后台账号设置 2.找到左下角的Developer settings 3.找到Personal access tokens 的 Tokens(classic) 4.选择创建新证书 5.填写证书信息 6.点击生成证书&#xff0c;复制证书并且保存起来&#xff08;血泪教训&#xff0c;证书只会在创建时显示一次&#xff0c;以后就再也…

篮球论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

iOS UIFont-实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

SpringBoot3任务处理

目录 1.异步任务 无返回值异步任务 效果 有返回值异步任务 效果 2.定时任务 效果 3.邮件任务 获取授权码 加入依赖 配置文件 纯文本邮件 效果 复杂邮件 效果 1.异步任务 Async注释&#xff1a; SpringBoot中的异步调用&#xff0c;可以写在类上或方法上&#…

如何选择指纹浏览器?盘点好用是防关联浏览器

在网络世界中&#xff0c;保护您的在线隐私和安全非常重要。反检测浏览器是专门为此诞生的工具&#xff0c;旨在通过更改浏览器指纹来帮助您做到这一点&#xff0c;它们使网站、广告商和其他人很难跟踪您的在线行为。 一、什么是反检测浏览器&#xff1f; 您是否想过网站如何检…

PCD3012五通道高功率因数LED控制芯片,集成700V高压MOSFET 低THD 外围极少元件

概述 PCD 3012B 是一款五段低 THD 、高功率因数 LED 线性恒流控制芯片&#xff0c;芯片集成了 700V 高压 MOSFET &#xff0c;采用独特创新的器件工艺技术&#xff0c;具有优越的抗雪崩击穿及浪涌能力&#xff0c;在外围无保护器件时可通过650V 雷击浪涌测试&#xff0c;内置…

实验7 内置对象response

编写代码&#xff0c;掌握request、response的用法。【参考课本4.6.2】 三、源代码以及执行结果截图&#xff1a; input.jsp <% page language"java" contentType"text/html; charsetutf-8" pageEncoding"utf-8"%> <!DOCTYPE html>…