当前位置: 首页 > news >正文

C++的STL 中 set.map multiset.multimap 学习使用详细讲解(含配套OJ题练习使用详细解答)

目录

一、set

1.set的介绍

2.set的使用

2.1 set的模板参数列表

2.2 set的构造

2.3 set的迭代器

2.4 set的容量

2.5 set的修改操作

2.6 set的使用举例

二、map

1.map的介绍

2.map的使用

2.1 map的模板参数说明

2.2 map的构造

2.3 map的迭代器

2.4 map的容量与元素访问

2.5 map中元素的修改

2.6 map的使用举例

三、multiset

1.multiset的介绍

2.multiset的使用

四、multimap

1.multimap的介绍

2.multimap的使用

五、OJ题练习使用

1.前K个高频单词

2.两个数组的交集

六、完结撒❀


一、set

1.set的介绍

set文档介绍

翻译:
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 中查找某个元素,时间复杂度为: log2 n
7. set 中的元素不允许修改 ( 为什么 ? --- 麻烦 排序的维护,唯一性的维护,时间复杂度的维护)
8. set 中的底层使用二叉搜索树 ( 红黑树 ) 来实现。

2.set的使用

2.1 set的模板参数列表

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

2.2 set的构造

函数声明功能介绍
set(const Compare& comp = Compare(),const Allocstor& = Allocator());构造空的set
set(InputIterator first,InputIterator last,const Compare& comp = Compare(),const Allocator& = Allocator());用[first,last)区间中的元素构造set
set(const set<Key,Compare,Allocator>& x);set的拷贝构造

2.3 set的迭代器

函数声明功能介绍
iterator begin()返回set中起始位置元素的迭代器
iterator end()
返回 set 中最后一个元素后面的迭代器
const_iterator cbegin()
const
返回 set 中起始位置元素的 const 迭代器
const_iterator cend() const
返回 set 中最后一个元素后面的 const 迭代器
reverse_iterator rbegin()
返回 set 第一个元素的反向迭代器,即 end
reverse_iterator rend()
返回 set 最后一个元素下一个位置的反向迭代器,
rbegin
const_reverse_iterator
crbegin() const
返回 set 第一个元素的反向 const 迭代器,即 cend
const_reverse_iterator
crend() const
返回 set 最后一个元素下一个位置的反向 const
代器,即 crbegin

2.4 set的容量

函数声明功能介绍
bool empty() const检测set是否为空,空返回true,否则返回false
size_type size() const返回set中有效元素个数

2.5 set的修改操作

函数声明功能介绍
pair<iterator,bool> insert (const value_type& x )
set 中插入元素 x ,实际插入的是 <x, x> 构成的
键值对,如果插入成功,返回 < 该元素在 set 中的
位置, true>, 如果插入失败,说明 x set 中已经
存在,返回 <x set 中的位置, false>
void erase ( iterator position )
删除 set position 位置上的元素
size_type erase ( const key_type& x )
删除 set 中值为 x 的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )
删除 set [first, last) 区间中的元素
void swap ( set<Key,Compare,Allocator>& st);
交换 set 中的元素
void clear ( )
set 中的元素清空
iterator find ( const key_type& x ) const
返回 set 中值为 x 的元素的位置,没有找到返回end()
size_type count ( const key_type& x ) const
返回 set 中值为 x 的元素的个数

2.6 set的使用举例

#include <set>
void TestSet()
{// 用数组array中的元素构造setint array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4,
6, 8, 0 };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;
}

二、map

1.map的介绍

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 通常被实现为二叉搜索树 ( 更准确的说:平衡二叉搜索树 ( 红黑树 ))

2.map的使用

2.1 map的模板参数说明

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

2.2 map的构造

函数声明功能介绍
map()构造一个空的map

2.3 map的迭代器

函数声明功能介绍
begin()和end()
begin: 首元素的位置, end 最后一个元素的下一个位置
cbegin()和cend()
begin end 意义相同,但 cbegin cend 所指向的元素不
能修改
rbegin()和rend()
反向迭代器, rbegin end 位置, rend begin 位置,其
++ -- 操作与 begin end 操作移动相反
crbegin()和crend()
rbegin rend 位置相同,操作相同,但 crbegin crend
指向的元素不能修改

2.4 map的容量与元素访问

函数声明功能介绍
bool empty ( ) const
检测 map 中的元素是否为空,是返回
true ,否则返回 false
size_type size() const
返回 map 中有效元素的个数
mapped_type& operator[] (const
key_type& k)
返回 key 对应的 value
问题:当 key 不在 map 中时,通过 operator 获取对应 value 时会发生什么问题?

注意:在元素访问时,有一个与 operator[] 类似的操作 at()( 该函数不常用 ) 函数,都是通过
key 找到与 key 对应的 value 然后返回其引用,不同的是: key 不存在时, operator[] 用默认
value key 构造键值对然后插入,返回该默认 value at() 函数直接抛异常

2.5 map中元素的修改

函数声明功能简介
pair<iterator,bool> insert (const value_type& x)
map 中插入键值对 x ,注意 x 是一个键值 对,返回值也是键值对: iterator 代表新插入 元素的位置, bool 代表释放插入成功
void erase ( iterator position )
删除 position 位置上的元素
size_type erase ( const key_type& x )
删除键值为 x 的元素
void erase ( iterator first, iterator last )
删除 [first, last) 区间中的元素
void swap ( map<Key,T,Compare,Allocator>& mp)
交换两个 map 中的元素
void clear ( )
map 中的元素清空
iterator find ( const key_type& x )
map 中插入 key x 的元素,找到返回该元 素的位置的迭代器,否则返回 end
const_iterator find ( const key_type& x ) const
map 中插入 key x 的元素,找到返回该元 素的位置的 const 迭代器,否则返回 cend
size_type count ( const key_type& x ) const
返回 key x 的键值在 map 中的个数,注意 map key 是唯一的,因此该函数的返回值 要么为 0 ,要么为 1 ,因此也可以用该函数来
检测一个 key 是否在 map

2.6 map的使用举例

#include <string>
#include <map>
void TestMap()
{map<string, string> m;// 向map中插入元素的方式:// 将键值对<"peach","桃子">插入map中,用pair直接来构造键值对m.insert(pair<string, string>("peach", "桃子"));// 将键值对<"peach","桃子">插入map中,用make_pair函数来构造键值对m.insert(make_pair("banan", "香蕉"));// 借用operator[]向map中插入元素/*operator[]的原理是:用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器operator[]函数最后将insert返回值键值对中的value返回*/// 将<"apple", "">插入map中,插入成功,返回value的引用,将“苹果”赋值给该引用结果,m["apple"] = "苹果";// key不存在时抛异常//m.at("waterme") = "水蜜桃";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;elsecout << "键值为peach的元素已经存在:" << ret.first->first << "--->"<< ret.first->second << " 插入失败" << endl;// 删除key为"apple"的元素m.erase("apple");if (1 == m.count("apple"))cout << "apple还在" << endl;elsecout << "apple被吃了" << endl;
}
【总结】
1. map 中的的元素是键值对
2. map 中的 key 是唯一的,并且不能修改
3. 默认按照小于的方式对 key 进行比较
4. map 中的元素如果用迭代器去遍历,可以得到一个有序的序列
5. map 的底层为平衡搜索树 ( 红黑树 ) ,查找效率比较高 O(log_2 N)
6. 支持 [] 操作符, operator[] 中实际进行插入查找。

三、multiset

1.multiset的介绍

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 底层结构为二叉搜索树 ( 红黑树 )。
注意:
1. multiset 中在底层中存储的是 <value, value> 的键值对
2. multiset 的插入接口中只需要插入即可
3. set 的区别是, multiset 中的元素可以重复, set 是中 value 是唯一的
4. 使用迭代器对 multiset 中的元素进行遍历,可以得到有序的序列
5. multiset 中的元素不能修改
6. multiset 中找某个元素,时间复杂度为 O(log_2 N)
7. multiset 的作用:可以对元素进行排序

2.multiset的使用

此处只简单演示 set multiset 的不同,其他接口与 set 相同,可参考 set
#include <set>
void TestSet()
{int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7 };// 注意:multiset在底层实际存储的是<int, int>的键值对multiset<int> s(array, array + sizeof(array) / sizeof(array[0]));for (auto& e : s)cout << e << " ";cout << endl;return 0;
}

四、multimap

1.multimap的介绍

multimap文档链接

翻译:
1. Multimaps 是关联式容器,它按照特定的顺序,存储由 key value 映射成的键值对 <key,
value> ,其中多个键值对之间的 key 是可以重复的
2. multimap 中,通常按照 key 排序和唯一地标识元素,而映射的 value 存储与 key 关联的内
容。 key value 的类型可能不同,通过 multimap 内部的成员类型 value_type 组合在一起,
value_type 是组合 key value 的键值对 :
typedef pair<const Key, T> value_type;
3. 在内部, multimap 中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对
key 进行排序的。
4. multimap 通过 key 访问单个元素的速度通常比 unordered_multimap 容器慢,但是使用迭代
器直接遍历 multimap 中的元素可以得到关于 key 有序的序列。
5. multimap 在底层用二叉搜索树 ( 红黑树 ) 来实现。
注意: multimap map 的唯一不同就是: map 中的 key 是唯一的,而 multimap key 是可以
重复的

2.multimap的使用

multimap 中的接口可以参考 map ,功能都是类似的。
注意:
1. multimap 中的 key 是可以重复的。
2. multimap 中的元素默认将 key 按照小于来比较
3. multimap 中没有重载 operator[] 操作 ( 可思考下为什么 ?) 。(多个key与value没有形成映射关系)
4. 使用时与 map 包含的头文件相同。

 五、OJ题练习使用

1.前K个高频单词

题目:

基本思路:

使用map将所有单词出现的次数进行存储,在使用vector进行排序,再将前K个push_back到新的vector里面进行返回。

解题代码:

class Solution {
public:struct kvCom{bool operator()(const pair<string,int> V1,const pair<string,int> V2){return (V1.second > V2.second) || (V1.second == V2.second && V1.first < V2.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> CountMap;for(auto& e : words){CountMap[e]++;}//按照int排序vector<pair<string,int>> v(CountMap.begin(),CountMap.end()); //stable_sort(v.begin(),v.end(),kvCom());sort(v.begin(),v.end(),kvCom());vector<string> vs;for(size_t i=0; i<k;i++){//cout<<v[i].first<<":"<<v[i].second<<endl;vs.push_back(v[i].first);}return vs;}
};

 2.两个数组的交集

题目:

基本思路:
通过将两个数组分别存进两个set里面(这一步也完成了去重,防止出现多个交集),再用一个vector进行存储返回,之后在其中一个set中查找是否存在另一个set中的值,若存在则push_back到vector中,循环操作,最后将vector进行返回。

解题代码:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> s1(nums1.begin(),nums1.end());//已经完成去重工作set<int> s2(nums2.begin(),nums2.end());vector<int> v;for(auto e : s1){auto ret = s2.find(e);if(ret != s2.end()){v.push_back(*ret);}}return v;}
};

六、完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友❤

相关文章:

C++的STL 中 set.map multiset.multimap 学习使用详细讲解(含配套OJ题练习使用详细解答)

目录 一、set 1.set的介绍 2.set的使用 2.1 set的模板参数列表 2.2 set的构造 2.3 set的迭代器 2.4 set的容量 2.5 set的修改操作 2.6 set的使用举例 二、map 1.map的介绍 2.map的使用 2.1 map的模板参数说明 2.2 map的构造 2.3 map的迭代器 2.4 map的容量与元…...

【Java笔记】第10章:接口

前言1. 接口的概念与定义2. 接口的声明与语法3. 接口的实现4. 接口的继承5. 接口的默认方法6. 接口的静态方法7. 接口的私有方法8. 接口的作用9. 接口与抽象类的区别10. 接口在Java集合中的应用结语 上期回顾:【Java笔记】第9章&#xff1a;三个修饰符 个人主页&#xff1a;C_G…...

Angular知识概览

Angular 是一个由 Google 维护的开源前端框架&#xff0c;用于构建动态网页应用。以下是对 Angular 主要概念和特性的概览&#xff1a; 1. Angular 的核心概念 - 组件 (Component)&#xff1a;Angular 应用的基本构建块。每个组件包括一个 TypeScript 类&#xff0c;用于处理数…...

经典文献阅读之--Online Monocular Lane Mapping(使用Catmull-Rom样条曲线完成在线单目车道建图)

0. 简介 对于单目摄像头完成SLAM建图这类操作&#xff0c;对于自动驾驶行业非常重要&#xff0c;《Online Monocular Lane Mapping Using Catmull-Rom Spline》介绍了一种仅依靠单个摄像头和里程计生成基于样条的在线单目车道建图方法。我们提出的技术将车道关联过程建模为一个…...

frida timed out

从Android Q(10)开始&#xff0c;Google引入了一种新的机制&#xff0c;加快了app的启动时间 Android USAP 进程启动流程 adb shell su ps -A | grep usaproot 9917 1032 6577052 13676 __skb_wait_for_more_packets 0 S usap64 root 9928 1032 6577052…...

51单片机-独立按键控制灯灯灯

目录 简介: 一. 1个独立按钮控制一个灯例子 二. 在加一个独立按键,控制第二个灯 三. 第一个开关 开灯, 第二个开关关灯 四. 点一下开灯,在点一下关灯 五. 总结 简介: 51 单片机具有强大的控制能力&#xff0c;而独立按键则提供了一种简单的输入方式。 当把独立按键与 …...

【C++】用红黑树封装map、set

用红黑树封装map、set 1. 红黑树1.1 模板参数的控制1.1.1 Value1.1.2 KeyOfValue 1.2 正向迭代器1.2.1 构造函数1.2.2 begin()end()1.2.3 operator()1.2.4 operator--()1.2.5 operator*()1.2.6 operator->()1.2.7 operator()1.2.8 operator!()1.2.9 总代码 1.3 反向迭代器1.…...

【中颖】SH79F9202 串口通信

头文件 uart.h #ifndef UART_H #define UART_H#include "SH79F9202.h" #include "LCD.h" #include "timer2.h" #include "timer5.h" #include "cpu.h" #include "key.h" #include "io.h" #include &qu…...

IDEA创建Maven项目

IDEA创建Maven项目 第一步&#xff1a;创建新项目 或者 第二步&#xff1a;创建maven模块 前提条件&#xff1a; File>>Settings&#xff0c;检查自己的maven是否已经安装配置好 创建maven模块 其中Archetype一般选择如下 点击创建后生成如下 需要在main目录下创…...

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中&#xff0c;由于部分设计会存在重复引用各个模板的文件&#xff0c;并且基础架构中需要基础模块内容&#xff0c;就想到自动生成代码模板&#xff0c;刚好之前有使用过goctl&#xff0c;以下就简单描述下gozero中goctl场景和逻辑&#xff0c;后续自己借鉴将自…...

碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测

碳素钢的品种主要有圆钢、扁钢、方钢等。经冷、热加工后钢材的表面不得有裂缝、结疤、夹杂、折叠和发纹等缺陷。尺寸和允许公差必须符合相应品种国家标准的要求。 具体分类、按化学成分分类 &#xff1a; 碳素钢按化学成分&#xff08;即以含碳量&#xff09;可分为低碳钢、中…...

C++ list链表的使用和简单模拟实现

目录 前言 1. list的简介 2.list讲解和模拟实现 2.1 默认构造函数和push_back函数 2.2 迭代器实现 2.2.1 非const正向迭代器 2.2.2 const正向迭代器 2.2.3 反向迭代器 2.3 插入删除函数 2.3.1 insert和erase 2.3.2 push_back pop_back push_front pop_front 2.4 构…...

dependencies?devDependencies?peerDependencies

之前使用的npm包中&#xff0c;我用到了sass包。我当时没有在packagejson中添加依赖项&#xff0c;而是另外install的。这就引起了我的一个思考 初步想法&#xff1a; 我的npm包需要使用sass&#xff0c;那么我应该放在dependencies中&#xff0c;当使用的时候会直接下载 问题…...

在LUAT中使用MQTT客户端,游戏脚本,办公脚本自动操作

本文将介绍在LUAT中工程化使用MQTT客户端的方法及注意事项。实验平台为合宙AIR724UG&#xff0c;其固件版本为Luat_V4001_RDA8910_FLOAT_TMP。 面向对象 使用middleclass库为脚本提供基础面向对象支持&#xff0c;将此repo中的middleclass.lua文件添加到项目中即可使用。middl…...

如何解决maven中snapshot相关jar无法拉取问题

Maven中的SNAPSHOT版本是指正在开发中的版本&#xff0c;这些版本可能会频繁地更新。在使用Maven构建项目时&#xff0c;有时会遇到无法拉取SNAPSHOT相关jar的问题。以下是几种常见的解决方案&#xff1a; 1. 检查Maven配置文件&#xff08;settings.xml&#xff09; 确保你的M…...

类似crossover的容器软件有哪些 除了crossover还有什么 Mac虚拟机替代品

CrossOver是Mac用来运行exe文件的一款软件&#xff0c;但是并不是所有的exe文件CrossOver都支持运行。想要在Mac上运行exe文件的方法并不是只有使用CrossOver这一种&#xff0c;那么有没有类似的软件也可以实现exe文件在Mac上运行呢&#xff1f; CrossOver类似软件有哪些 1、Pl…...

以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】

【Less-54】 与前面的题目不同是&#xff0c;这里只能提交10次&#xff0c;一旦提交超过十次&#xff0c;数据会重新刷新&#xff0c;所有的步骤需要重来一次。 解题步骤&#xff1a; 根据测试&#xff0c;使用的是单引号闭合。 # 判断字段的数量 ?id1 order by 3 -- aaa# …...

详解 Flink 的时间语义和 watermark

一、Flink 时间语义类型 Event Time&#xff1a;是事件创建的时间。它通常由事件中的时间戳描述&#xff0c;例如采集的日志数据中&#xff0c;每一条日志都会记录自己的生成时间&#xff0c;Flink 通过时间戳分配器访问事件时间戳Ingestion Time &#xff1a;是数据进入 Flink…...

Unreal Engine项目结构与关卡设置详解

引言 Unreal Engine 是一款功能强大的游戏引擎&#xff0c;为开发者提供了丰富的工具来创建和管理游戏项目。本文将详细介绍一个基本的 Unreal Engine 项目结构&#xff0c;并讲解如何在 Unreal 编辑器中进行关卡设置与操作。 Unreal Engine 项目结构 一个基本的 Unreal Eng…...

Access数据中的SQL偏移注入

使用场景&#xff1a; 目标数据表的字段较多&#xff0c;无法一一获取的时候&#xff0c;尝试使用偏移注入的方式实现SQL注入。 原理&#xff1a; 例如&#xff1a;一个表有6个字段&#xff0c;而你想获取的目标表admin的字段不知道&#xff0c;此时可以使用联合查询的方式获…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...