【C++】set、multiset与map、multimap的使用

目录

  • 一、关联式容器
  • 二、键值对
  • 三、树形结构的关联式容器
    • 3.1 set
      • 3.1.1 模板参数列表
      • 3.1.2 构造
      • 3.1.3 迭代器
      • 3.1.4 容量
      • 3.1.5 修改操作
    • 3.2 multiset
    • 3.3 map
      • 3.3.1 模板参数列表
      • 3.3.2 构造
      • 3.3.3 迭代器
      • 3.3.4 容量
      • 3.3.5 修改操作
      • 3.3.6 operator[]
    • 3.4 multimap

一、关联式容器

谈到关联式容器,先来说说序列式容器,以前学习的vector、list、deque等就是序列式容器,它们的特点是底层为线性序列的数据结构,存储的是元素本身。关联式容器也是存储数据的,不同的是,里面存储的是<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)
{}
};

三、树形结构的关联式容器

STL总共有两种结构的关联式容器,分别是哈希结构和树形结构。树形结构主要有4种:set、multiset、map、multimap,它们的共同点是底层是平衡搜索树即红黑树实现的,且容器中的元素是一个有序的序列。

3.1 set

特点:

  1. 遍历set中的元素,可以得到一个有序序列,因为它的底层实现是红黑树,再底层是二叉搜索树,遍历方式是中序遍历。
  2. set中的元素不可以重复,因此可以用set去重。
  3. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
  4. set中插入元素时,只需要插入value即可,不需要构造键值对。
  5. set中的元素默认按照小于来比较。
  6. set中查找某个元素,时间复杂度为:logN,即最多高度次。
  7. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  8. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  9. set中的元素不允许修改,因为修改了其中的一个元素会改变内部的结构,从而影响有序性。
  10. set在底层是用二叉搜索树(红黑树)实现的。

3.1.1 模板参数列表

在这里插入图片描述

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

3.1.2 构造

1️⃣构造空的set:

set<int> s;

2️⃣用迭代器区间构造:

set<int> s1(s.begin(), s.end());

3️⃣拷贝构造:

set<int> s2(s);

3.1.3 迭代器

1️⃣begin+end
正向遍历

	set<int> s;
	s.insert(1);
	s.insert(3);
	s.insert(3);
	s.insert(3);
	s.insert(5);
	s.insert(2);
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

这里顺便检验下是否去重且有序:
在这里插入图片描述

2️⃣rbegin+rend
与上面类似,只不过是反向遍历

	set<int>::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

在这里插入图片描述

3.1.4 容量

1️⃣empty
判断set是否为空,空返回true,否则返回true

	set<int> s;
	cout << s.empty() << endl;//1

2️⃣size
返回set中有效元素的个数

set<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
s.insert(3);
s.insert(5);
s.insert(2);
cout << s.size() << endl;//4

3.1.5 修改操作

1️⃣insert

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

在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false>。

set<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{
	cout << e << " ";
}
cout << endl;

在这里插入图片描述

2️⃣erase
删除有三种方式:

删除set中position位置上的元素

void erase ( iterator position )

set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{
	cout << e << " ";
}
cout << endl;
set<int>::iterator pos = s.begin();
s.erase(pos);
for (auto& e : s)
{
	cout << e << " ";
}

在这里插入图片描述

删除set中值为x的元素,返回删除的元素的个数

size_type erase ( const key_type& x )

set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{
	cout << e << " ";
}
cout << endl;
s.erase(3);
for (auto& e : s)
{
	cout << e << " ";
}

在这里插入图片描述

删除set中[first, last)区间中的元素

void erase ( iterator first, iterator last )

set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{
	cout << e << " ";
}
cout << endl;
s.erase(s.begin(), s.end());
for (auto& e : s)
{
	cout << e << " ";
}

在这里插入图片描述

3️⃣swap
交换set中的元素

void swap ( set<Key,Compare,Allocator>& st );

	set<int> s1;
	s1.insert(1);
	s1.insert(3);
	s1.insert(5);
	for (auto& e : s1)
	{
		cout << e << " ";//1 3 5
	}
	cout << endl;
	set<int> s2;
	s2.insert(7);
	s2.insert(8);
	s2.insert(6);
	for (auto& e : s2)
	{
		cout << e << " "; //6 7 8
	}
	cout << endl;
	s2.swap(s1);
	for (auto& e : s1)
	{
		cout << e << " ";//6 7 8
	}
	cout << endl;
	for (auto& e : s2)
	{
		cout << e << " ";//1 3 5
	}

4️⃣clear
将set中的元素清空

void clear ( )

set<int> s1;
s1.insert(1);
s1.insert(3);
s1.insert(5);
s1.clear();
for (auto& e : s1)
{
	cout << e << " ";// 空
}

5️⃣find
找到了,返回set中值为x的元素的位置,如果每找到,返回最后一个元素的下一个位置

iterator find ( const key_type& x ) const

set<int> s1;
s1.insert(1);
s1.insert(3);
s1.insert(5);
//s1.clear();
set<int>::iterator pos = s1.find(3);
if (pos != s1.end())
	cout << "找到了" << endl;//找到了
else
	cout << "没找到" << endl;

6️⃣count
返回set中值为x的元素的个数,因为set是去重的,所以存在返回1,不存在返回0

size_type count ( const key_type& x ) const

set<int> s1;
s1.insert(1);
s1.insert(3);
s1.insert(5);
cout << s1.count(3) << endl;//1
cout << s1.count(33) << endl;//0

3.2 multiset

multiset与set的区别是存储的元素可以重复

void test_set8()
{
	multiset<int> s;
	s.insert(1);
	s.insert(3);
	s.insert(3);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(2);
	for (auto& e : s)
	{
		cout << e << " ";//1 2 3 3 5 5 5
	}
}

还有接口与set的不同,分别是find和count

set的find与multiset的find
set不能有重复元素,所以找到了返回该元素的位置;multiset有重复元素,找到了返回该元素的第一个的位置。找不到都是返回end()

multiset<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
multiset<int>::iterator pos = s.find(3);//返回第一个3的位置
while (pos != s.end())
{
	cout << *pos << " ";// 3 3
	++pos;
}
cout << endl;
}

set的count与multiset的count
set没有重复元素,所以存在的元素返回1,不存在返回0;multiset有重复元素,所以存在返回该元素的个数,不存在返回0

multiset<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
s.insert(3);
s.insert(3);
cout << s.count(3) << endl;//4

3.3 map

与sert一样,map可以使容器的元素有序且去重
特点:

  1. map中的元素是键值对,由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中的key是唯一的,并且不能修改
  5. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  6. map支持下标访问符,可以进行插入、查找和修改
  7. map的底层为平衡搜索树(红黑树)

3.3.1 模板参数列表

在这里插入图片描述

  • key: 键值对中key的类型
  • T: 键值对中value的类型
  • Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
  • Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器

3.3.2 构造

1️⃣构造空的map

map<string, string> m;

2️⃣用迭代器区间进行构造

map<string, string> m1(m.begin(), m.end());

3️⃣拷贝构造

map<string, string> m2(m);

3.3.3 迭代器

1️⃣begin和end
正向遍历

map<string, string> m;
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("apple", "苹果"));
m.insert(pair<string, string>("left", "左边"));
map<string, string>::iterator it = m.begin();
while (it != m.end())
{
	cout << *it << " ";//错误写法,编译报错
	++it;
}

因为map的每个元素是键值对,由key和value组成,即pair,而且它们的类型不一定相同,所以要用 . 或者 -> 指向对应的成员

map<string, string> m;
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("apple", "苹果"));
m.insert(pair<string, string>("left", "左边"));
map<string, string>::iterator it = m.begin();
while (it != m.end())
{
	//cout << (*it).first << ":" << (*it).second << endl;
	cout << it->first << ":" << it->second << endl;
	++it;
}

在这里插入图片描述

2️⃣rbegin和rend
反向遍历

map<string, string>::reverse_iterator rit = m.rbegin();
while (rit != m.rend())
{
	//cout << (*rit).first << ":" << (*rit).second << endl;
	cout << rit->first << ":" << rit->second << endl;
	++rit;
}

在这里插入图片描述

3.3.4 容量

1️⃣empty
检测map中的元素是否为空,是返回true,否则返回false

map<string, string> m;
cout << m.empty() << endl;//1

2️⃣size
返回map中有效元素的个数

m.insert(pair<string, string>("left", "左边"));
cout << m.size() << endl;//1

3.3.5 修改操作

1️⃣insert

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

在map中插入的是键值对,返回值也是键值对,如果插入成功,则返回当前元素(键值对)的位置和true,插入失败,则返回原来已有的元素的位置和false

插入的方式有三种写法:

map<string, string> m;
m.insert(pair<string, string>("sort", "排序"));//C++98
m.insert(make_pair("apple", "苹果"));//C++98
m.insert({ "left", "左边" }); //C++11 多参数隐式类型转换

在这里插入图片描述

2️⃣erase
删除有3种方式,与set相同:

删除position位置上的元素

void erase ( iterator position )

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
m.insert(make_pair("left", "左边"));
for (auto& e : m)
{
	cout << e.first << ":" << e.second << " ";
}
cout << endl;
map<string, string>::iterator pos = m.begin();
m.erase(pos);
for (auto& e : m)
{
	cout << e.first << ":" << e.second << " ";
}

在这里插入图片描述

删除键值为x的元素

size_type erase ( const key_type& x )

m.erase("sort");

在这里插入图片描述

删除[first, last)区间中的元素

void erase ( iterator first, iterator last )

m.erase(m.begin(), m.end());

3️⃣swap
交换两个map中的元素

void swap ( map<Key,T,Compare,Allocator>& mp )

map<string, string> m1;
m1.insert(make_pair("sort", "排序"));
m1.insert(make_pair("apple", "苹果"));
for (auto& e : m1)
{
	cout << e.first << ":" << e.second << " ";
}
map<string, string> m2;
m2.insert(make_pair("left", "左边"));
m2.insert(make_pair("right", "右边"));
for (auto& e : m2)
{
	cout << e.first << ":" << e.second << " ";
}
m2.swap(m1);
for (auto& e : m1)
{
	cout << e.first << ":" << e.second << " ";
}
for (auto& e : m2)
{
	cout << e.first << ":" << e.second << " ";
}

在这里插入图片描述

4️⃣clear
将map中的元素清空

void clear ( )

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.clear();
cout << m.empty() << endl;//1

5️⃣find
查找key为x的元素,找到了返回该元素的迭代器,找不到返回end

iterator find ( const key_type& x )

map<string, string> m;
m.insert(make_pair("sort", "排序"));
map<string, string>::iterator pos = m.find("sort");
if (pos != m.end())
	cout << "找到了" << endl;//找到了
else
	cout << "没找到" << endl;

6️⃣count
返回key为x在map中的个数,由于map会去重,所以存在返回1,不存在返回0

size_type count ( const key_type& x ) const

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
cout << m.count("sort") << endl;//1
cout << m.count("apple") << endl;//0

3.3.6 operator[]

mapped_type& operator[] (const key_type& k);

该函数的参数是key,返回值是value。可以用来插入、查找、修改和计数。先来看看使用:

1️⃣插入:如果key没有重复,插入成功

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m["left"];//插入
for (auto& e : m)
{
	cout << e.first << ":" << e.second << endl;
}

在这里插入图片描述

2️⃣查找:插入的key已经存在,查找到该key对应的value

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
cout << m["apple"] << endl;//苹果

3️⃣修改:插入的key已经存在,同时右边如下代码所示,将该key对应的value修改

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
m["sort"] = "排序的英文";
for (auto& e : m)
{
	cout << e.first << ":" << e.second << endl;
}

在这里插入图片描述

4️⃣插入+修改:插入key没有重复,且右边如下代码所示,修改对应的value(其实是补上)

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
m["left"] = "左边";
for (auto& e : m)
{
	cout << e.first << ":" << e.second << endl;
}

在这里插入图片描述

5️⃣统计次数

map<string, int> m;
string arr[] = { "sort","sort" ,"apple" ,"apple", "banana","one" };
for (auto& e : arr)
{
	m[e]++;
}
for (auto& e : m)
{
	cout << e.first << ":" << e.second << " ";
	cout << endl;
}

在这里插入图片描述

接下来看看operator[]是如何实现以上操作的:
在这里插入图片描述

operator[]内部其实调用了insert函数
在这里插入图片描述
我们再来看看insert函数:
在这里插入图片描述
回顾下,insert函数的要插入的数据类型是键值对
在这里插入图片描述
它的返回类型也是键值对,operator[]调用insert函数得到的返回值是迭代器,对迭代器解引用然后点访问迭代器的第二个成员,最后返回该成员。

梳理下:
首先看operator[]调用insert函数,而insert里面的make_pair是(k, mapped_type()),也就是说key值是要输入的,而value我们不写编译器帮我们默认构造出来,int类型是0。接着insert函数就要返回了,返回的是键值对,插入成功,返回该位置的迭代器和true;插入失败,返回该位置的迭代器和false。.first,得到返回值的第一个成员,即迭代器。迭代器的本质是指针,指针指向的是该位置的key和对应的value,解引用指针,然后最后的 .second 得到是该迭代器的value,即插入的key对应的value

3.4 multimap

multimap与map的区别和multiset与set的区别相同,都能形成有序,但是multimap可以允许元素重复

multimap<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("left", "左边"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
m.insert(make_pair("apple", "苹果"));
for (auto& e : m)
{
	cout << e.first << ":" << e.second << " ";
	cout << endl;
}

在这里插入图片描述

还有find和count:

map的find与multimap的find
map返回该元素的迭代器,multimap返回该元素的第一个的迭代器

multimap<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
multimap<string, string>::iterator pos = m.find("sort");
while (pos != m.end())
{
	cout << pos->first << ":" << pos->second << endl;
	++pos;
}

在这里插入图片描述

map的count与multimap的count
map没有重复元素,所以该元素存在返回1,不存在返回0;multimap可以有重复元素,存在返回该元素的个数,不存在返回0

multimap<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "苹果"));
cout << m.count("sort") << endl;//2
cout << m.count("apple") << endl;//1
cout << m.count("left") << endl;//0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue开发实例(五)修改项目入口页面布局

修改项目入口 一、创建新入口二、分析代码&#xff0c;修改入口三、搭建项目主页面布局1、Container 布局容器介绍2、创建布局3、布局器铺满屏幕4、创建Header页面5、加入Aside、Main和Footer模块 一、创建新入口 创建新的入口&#xff0c;取消原来的HelloWorld入口 参考代码…

测试需求平台9-Table 组件应用产品列表优化

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版&#xff0c;拥抱Vue3.0将前端框架替换成字节最新开源的arco.design&#xff0c;其中约60%重构和20%新增内容&#xff0c;定位为从 0-1手把手实现简单的测试平台开发教程&#xff0c;内容将囊括基础、扩展和实战&a…

文件操作和IO(2):Java中操作文件

目录 一、File的属性 二、File的构造方法 三、File的方法 四、代码示例 1、getName&#xff0c;getParent&#xff0c;getPath方法 2、getAbsolutePath&#xff0c;getCanonicalPath方法 3、exists&#xff0c;isDirectory&#xff0c;createNewFile方法 4、createNewF…

【04】C语言括号匹配问题

欢迎来到土土的博客~&#x1f973;&#x1f973;&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;C语言系列函数实现 题目描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xf…

金融业被网络攻击了怎么办,如何治理和风险控制?

近年来&#xff0c;网络罪犯的人数和复杂程度都在增加&#xff0c;网络罪犯的目标锁定变得更具策略性&#xff0c;更加专注于最大效率和获利。随着有关全球网络犯罪的数据持续涌入&#xff0c;可以看出金融服务企业已然成为头号锁定目标。虽然金融服务企业在网络安全人员、工具…

python 基础知识点(蓝桥杯python科目个人复习计划57)

今日复习计划&#xff1a;做题 例题1&#xff1a;笨笨的机器人 问题描述&#xff1a; 肖恩有一个机器人&#xff0c;他能根据输入的指令移动相应的距离。但是这个机器人很笨&#xff0c;他永远分不清往左边还是往右边移动。肖恩也知道这一点&#xff0c;所以他设定这个机器人…

实现数组方法 forEach map filter every

手写forEach Array.prototype.myforEach function (fn, thisValue) {let index 0;let arr thisValue || this;if (typeof fn ! function) {throw new TypeError(fn is not a function)}while (index < arr.length) {if (index in arr) {fn.call (thisValue, arr[index],…

AI入门笔记(三)

神经网络是如何工作的 神经网络又是如何工作的呢&#xff1f;我们用一个例子来解释。我们看下面这张图片&#xff0c;我们要识别出这些图片都是0并不难&#xff0c;要怎么交给计算机&#xff0c;让计算机和我们得出同样的结果&#xff1f;难点就在于模式识别的答案不标准&…

Mybatis_plus-逻辑删除、通用枚举、自动填充、插件等

一、逻辑删除 曾经我们写的删除代码都是物理删除。 逻辑删除&#xff1a;删除转变为更新 ​ update user set deleted1 where id 1 and deleted0 查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段 ​ 查找: select id,nam…

【NR 定位】3GPP NR Positioning 5G定位标准解读(五)

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

扑克牌翻牌记忆小游戏源码

源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果预览 下载地址 https://www.qqmu.com/2296.html

Spring学习笔记(七)SpringMVC入门

一.什么是Spring MVC 1.什么是MVC&#xff08;一种思想模式&#xff09; M:模型 V:视图 C:控制器 2、Java EE三层架构 在Java EE开发中&#xff0c;系统经典的三层架构包括表现层、业务层和持久层。 表现层&#xff08;Web层&#xff09;负责接收客户端请求&#xff0c;并…

Linux基本指令(下)

目录 1. less指令 2. head与tail指令 3. find指令 示例 4. grep指令 示例 ​编辑 5. zip/unzip 打包与压缩 示例 ​编辑 6. tar指令 7. find指令&#xff1a; -name 8. echo指令 9. 时间相关的指令 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff…

更详细的软件测试理论基础:流程,开发、测试模型,测试分类,测试用例及其设计方法,缺陷

文章目录 一、测试流程二、开发模型1、 瀑布模型2、增量模型3、快速模型4、其他 三、测试模型1、V模型2、W模型 四、测试分类五、测试用例 test case六、测试用例设计方法1、等价类划分法2、边界值分析法3、因果图法4、判定表法5、正交法6、场景法7、流程分析法8、错误推测法方…

OpenAI回击马斯克的起诉:GPT-4不是AGI,所以没必要开源

前情提要 上一集我们讲到&#xff0c;马斯克起诉了OpenAI&#xff0c;扬言其背叛了公司成立时达成的一项协议&#xff0c;即开发技术的目的是“造福人类”而非利润。 “OpenAI已经变成了微软的一个闭源形态的实际子公司。在其新的董事会领导下&#xff0c;公司不仅在开发&…

FreeCad 有限元分析入门

2024.3 最新版本 0.21.2 FreeCad 有限元分析入门 基本步骤&#xff1a; 一、零件制作 1、创建立方体 2、修改参数 二、建立力学分析 1、为零件附着材料 2、增加固定约束 3、增加均布在表面的受力 4、零件网格化 …

Decoupled Knowledge Distillation解耦知识蒸馏

Decoupled Knowledge Distillation解耦知识蒸馏 现有的蒸馏方法主要是基于从中间层提取深层特征&#xff0c;而忽略了Logit蒸馏的重要性。为了给logit蒸馏研究提供一个新的视角&#xff0c;我们将经典的KD损失重新表述为两部分&#xff0c;即目标类知识蒸馏&#xff08;TCKD&a…

2024 年广东省职业院校技能大赛(高职组)“云计算应用”赛项样题 2

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&#…

第八节 龙晰Anolis 8.8 安装 DDE 桌面环境

一、前言 最小化安装的龙晰 Anolis OS 8.8 是不带图形化界面的&#xff0c;只能使用命令行&#xff0c;有些时候需要用到桌面环境&#xff0c;而DDE (Deepin Desktop Enviroment) 就是很好的桌面环境&#xff0c;它是指龙晰 Anolis 所搭载的中国自主桌面环境&#xff0c;用起来…

常数项级数

定义 级数的形式如下&#xff1a; ∑ n 1 ∞ u n u 1 u 2 u 3 . . . u n . . . \sum_{n1}^{\infin}u_n u_1u_2u_3...u_n... n1∑∞​un​u1​u2​u3​...un​... 这个数列的项数是无穷多个&#xff0c;如果取其前n项 S n u 1 u 2 . . . u n S_n u_1u_2...u_n Sn…