HarmonyOS 应用开发之非线性容器
非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。
HashMap
HashMap 可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。
HashMap依据泛型定义,集合中通过key的hash值确定其存储位置,从而快速找到键值对。HashMap的初始容量大小为16,并支持动态扩容,每次扩容大小为原始容量的2倍。HashMap底层基于HashTable实现,冲突策略采用链地址法。
HashMap和 TreeMap 相比,HashMap依据键的hashCode存取数据,访问速度较快。而TreeMap是有序存取,效率较低。
HashSet 基于HashMap实现。HashMap的输入参数由key、value两个值组成。在HashSet中,只对value对象进行处理。
需要快速存取、删除以及插入键值对数据时,推荐使用HashMap。
HashMap进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过set(key: K, value: V)函数每次在HashMap增加一个键值对。 |
访问元素 | 通过get(key: K)获取key对应的value值。 |
访问元素 | 通过keys()返回一个迭代器对象,包含map中的所有key值。 |
访问元素 | 通过values()返回一个迭代器对象,包含map中的所有value值。 |
访问元素 | 通过entries()返回一个迭代器对象,包含map中的所有键值对。 |
访问元素 | forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)访问整个map的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。 |
修改元素 | 通过replace(key: K, newValue: V)对指定key对应的value值进行修改操作。 |
修改元素 | 通过forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。 |
删除元素 | 通过remove(key: K)对map中匹配到的键值对进行删除操作。 |
删除元素 | 通过clear()清空整个map集合。 |
HashSet
HashSet 可用来存储一系列值的集合,存储元素中value是唯一的。
HashSet依据泛型定义,集合中通过value的hash值确定其存储位置,从而快速找到该值。HashSet初始容量大小为16,支持动态扩容,每次扩容大小为原始容量的2倍。value的类型满足ECMA标准中要求的类型。HashSet底层数据结构基于HashTable实现,冲突策略采用链地址法。
HashSet基于 HashMap 实现。在HashSet中,只对value对象进行处理。
HashSet和 TreeSet 相比,HashSet中的数据无序存放,即存放元素的顺序和取出的顺序不一致,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。
可以利用HashSet不重复的特性,当需要不重复的集合或需要去重某个集合的时候使用。
HashSet进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过add(value: T)函数每次在HashSet增加一个值。 |
访问元素 | 通过values()返回一个迭代器对象,包含set中的所有value值。 |
访问元素 | 通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。 |
访问元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)访问整个set的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
修改元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)对set中value进行修改操作。 |
删除元素 | 通过remove(value: T)对set中匹配到的值进行删除操作。 |
删除元素 | 通过clear()清空整个set集合。 |
TreeMap
TreeMap 可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。
TreeMap依据泛型定义,集合中的key值是有序的,TreeMap的底层是一棵二叉树,可以通过树的二叉查找快速的找到键值对。key的类型满足ECMA标准中要求的类型。TreeMap中的键值是有序存储的。TreeMap底层基于红黑树实现,可以进行快速的插入和删除。
TreeMap和 HashMap 相比,HashMap依据键的hashCode存取数据,访问速度较快。而TreeMap是有序存取,效率较低。
一般需要存储有序键值对的场景,可以使用TreeMap。
TreeMap进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过set(key: K,value: V)函数每次在TreeMap增加一个键值对。 |
访问元素 | 通过get(key: K)获取key对应的value值。 |
访问元素 | 通过getFirstKey()获取map中排在首位的key值。 |
访问元素 | 通过getLastKey()获取map中排在未位的key值。 |
访问元素 | 通过keys()返回一个迭代器对象,包含map中的所有key值。 |
访问元素 | 通过values()返回一个迭代器对象,包含map中的所有value值。 |
访问元素 | 通过entries()返回一个迭代器对象,包含map中的所有键值对。 |
访问元素 | 通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)访问整个map的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。 |
修改元素 | 通过replace(key: K,newValue: V)对指定key对应的value值进行修改操作。 |
修改元素 | 通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。 |
删除元素 | 通过remove(key: K)对map中匹配到的键值对进行删除操作。 |
删除元素 | 通过clear()清空整个map集合。 |
TreeSet
TreeSet 可用来存储一系列值的集合,存储元素中value是唯一的。
TreeSet依据泛型定义,集合中的value值是有序的,TreeSet的底层是一棵二叉树,可以通过树的二叉查找快速的找到该value值,value的类型满足ECMA标准中要求的类型。TreeSet中的值是有序存储的。TreeSet底层基于红黑树实现,可以进行快速的插入和删除。
TreeSet基于 TreeMap 实现,在TreeSet中,只对value对象进行处理。TreeSet可用于存储一系列值的集合,元素中value唯一且有序。
TreeSet和 HashSet 相比,HashSet中的数据无序存放,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。
一般需要存储有序集合的场景,可以使用TreeSet。
TreeSet进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过add(value: T)函数每次在TreeSet增加一个值。 |
访问元素 | 通过values()返回一个迭代器对象,包含set中的所有value值。 |
访问元素 | 通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。 |
访问元素 | 通过getFirstValue()获取set中排在首位的value值。 |
访问元素 | 通过getLastValue()获取set中排在未位的value值。 |
访问元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)访问整个set的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
修改元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)对set中value进行修改操作。 |
删除元素 | 通过remove(value: T)对set中匹配到的值进行删除操作。 |
删除元素 | 通过clear()清空整个set集合。 |
LightWeightMap
LightWeightMap 可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。LightWeightMap依据泛型定义,采用更加轻量级的结构,底层标识唯一key通过hash实现,其冲突策略为线性探测法。集合中的key值的查找依赖于hash值以及二分查找算法,通过一个数组存储hash值,然后映射到其他数组中的key值以及value值,key的类型满足ECMA标准中要求的类型。
初始默认容量大小为8,每次扩容大小为原始容量的2倍。
LightWeightMap和 HashMap 都是用来存储键值对的集合,LightWeightMap占用内存更小。
当需要存取key-value键值对时,推荐使用占用内存更小的LightWeightMap。
LightWeightMap进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过set(key: K,value: V)函数每次在LightWeightMap增加一个键值对。 |
访问元素 | 通过get(key: K)获取key对应的value值。 |
访问元素 | 通过getIndexOfKey(key: K)获取map中指定key的index。 |
访问元素 | 通过getIndexOfValue(value: V)获取map中指定value出现的第一个的index。 |
访问元素 | 通过keys()返回一个迭代器对象,包含map中的所有key值。 |
访问元素 | 通过values()返回一个迭代器对象,包含map中的所有value值。 |
访问元素 | 通过entries()返回一个迭代器对象,包含map中的所有键值对。 |
访问元素 | 通过getKeyAt(index: number)获取指定index对应的key值。 |
访问元素 | 通过getValueAt(index: number)获取指定index对应的value值。 |
访问元素 | 通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)访问整个map的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。 |
修改元素 | 通过setValueAt(index: number, newValue: V)对指定index对应的value值进行修改操作。 |
修改元素 | 通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。 |
删除元素 | 通过remove(key: K)对map中匹配到的键值对进行删除操作。 |
删除元素 | 通过removeAt(index: number)对map中指定index的位置进行删除操作。 |
删除元素 | 通过clear()清空整个map集合。 |
LightWeightSet
LightWeightSet 可用来存储一系列值的集合,存储元素中value是唯一的。
LightWeightSet依据泛型定义,采用更加轻量级的结构,初始默认容量大小为8,每次扩容大小为原始容量的2倍。集合中的value值的查找依赖于hash以及二分查找算法,通过一个数组存储hash值,然后映射到其他数组中的value值,value的类型满足ECMA标准中要求的类型。
LightWeightSet底层标识唯一value基于hash实现,其冲突策略为线性探测法,查找策略基于二分查找法。
LightWeightSet和 HashSet 都是用来存储键值的集合,LightWeightSet的占用内存更小。
当需要存取某个集合或是对某个集合去重时,推荐使用占用内存更小的LightWeightSet。
LightWeightSet进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过add(obj: T)函数每次在LightWeightSet增加一个值。 |
访问元素 | 通过getIndexOf(key: T)获取对应的index值。 |
访问元素 | 通过values()返回一个迭代器对象,包含map中的所有value值。 |
访问元素 | 通过entries()返回一个迭代器对象,包含map中的所有键值对。 |
访问元素 | 通过getValueAt(index: number)获取指定index对应的value值。 |
访问元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)访问整个set的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 |
修改元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)对set中元素进行修改操作。 |
删除元素 | 通过remove(key: K)对set中匹配到的键值对进行删除操作。 |
删除元素 | 通过removeAt(index: number)对set中指定index的位置进行删除操作。 |
删除元素 | 通过clear()清空整个set集合。 |
PlainArray
PlainArray 可用来存储具有关联关系的键值对集合,存储元素中key是唯一的,并且对于PlainArray来说,其key的类型为number类型。每个key会对应一个value值,类型依据泛型的定义,PlainArray采用更加轻量级的结构,集合中的key值的查找依赖于二分查找算法,然后映射到其他数组中的value值。
初始默认容量大小为16,每次扩容大小为原始容量的2倍。
PlainArray和 LightWeightMap 都是用来存储键值对,且均采用轻量级结构,但PlainArray的key值类型只能为number类型。
当需要存储key值为number类型的键值对时,可以使用PlainArray。
PlainArray进行增、删、改、查操作的常用API如下:
操作 | 描述 |
---|---|
增加元素 | 通过add(key: number,value: T)函数每次在PlainArray增加一个键值对。 |
访问元素 | 通过get(key: number)获取key对应的value值。 |
访问元素 | 通过getIndexOfKey(key: number)获取PlainArray中指定key的index。 |
访问元素 | 通过getIndexOfValue(value: T)获取PlainArray中指定value的index。 |
访问元素 | 通过getKeyAt(index: number)获取指定index对应的key值。 |
访问元素 | 通过getValueAt(index: number)获取指定index对应的value值。 |
访问元素 | 通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)访问整个plainarray的元素。 |
访问元素 | 通过[Symbol.iterator]():IterableIterator<[number, T]>迭代器进行数据访问。 |
修改元素 | 通过setValueAt(index:number, value: T)对指定index对应的value值进行修改操作。 |
修改元素 | 通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)对plainarray中元素进行修改操作。 |
删除元素 | 通过remove(key: number)对plainarray中匹配到的键值对进行删除操作。 |
删除元素 | 通过removeAt(index: number)对plainarray中指定index的位置进行删除操作。 |
删除元素 | 通过removeRangeFrom(index: number, size: number)对plainarray中指定范围内的元素进行删除操作。 |
删除元素 | 通过clear()清空整个PlainArray集合。 |
非线性容器的使用
此处列举常用的非线性容器HashMap、TreeMap、LightWeightMap、PlainArray的使用示例,包括导入模块、增加元素、访问元素及修改等操作,示例代码如下所示:
// HashMap
import HashMap from '@ohos.util.HashMap'; // 导入HashMap模块let hashMap1: HashMap<string, number> = new HashMap();
hashMap1.set('a', 123);
let hashMap2: HashMap<number, number> = new HashMap();
hashMap2.set(4, 123); // 增加元素
console.info(`result: ${hashMap2.hasKey(4)}`); // 判断是否含有某元素
console.info(`result: ${hashMap1.get('a')}`); // 访问元素// TreeMap
import TreeMap from '@ohos.util.TreeMap'; // 导入TreeMap模块let treeMap: TreeMap<string, number> = new TreeMap();
treeMap.set('a', 123);
treeMap.set('6', 356); // 增加元素
console.info(`result: ${treeMap.get('a')}`); // 访问元素
console.info(`result: ${treeMap.getFirstKey()}`); // 访问首元素
console.info(`result: ${treeMap.getLastKey()}`); // 访问尾元素// LightWeightMap
import LightWeightMap from '@ohos.util.LightWeightMap'; // 导入LightWeightMap模块let lightWeightMap: LightWeightMap<string, number> = new LightWeightMap();
lightWeightMap.set('x', 123);
lightWeightMap.set('8', 356); // 增加元素
console.info(`result: ${lightWeightMap.get('a')}`); // 访问元素
console.info(`result: ${lightWeightMap.get('x')}`); // 访问元素
console.info(`result: ${lightWeightMap.getIndexOfKey('8')}`); // 访问元素// PlainArray
import PlainArray from '@ohos.util.PlainArray' // 导入PlainArray模块let plainArray: PlainArray<string> = new PlainArray();
plainArray.add(1, 'sdd');
plainArray.add(2, 'sff'); // 增加元素
console.info(`result: ${plainArray.get(1)}`); // 访问元素
console.info(`result: ${plainArray.getKeyAt(1)}`); // 访问元素
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- ……
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向
相关文章:
HarmonyOS 应用开发之非线性容器
非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。 HashMap HashMap 可用来存储具有关联…...
Golang Context是什么
一、这篇文章我们简要讨论Golang的Context有什么用 1、首先说一下Context的基本作用,然后在讨论他的实现 (1)数据传递,子Context只能看到自己的和父Context的数据,子Context是不能看到孙Context添加的数据。 (2)父子协程的协同,比…...
算法基础--递推
😀前言 递推算法在计算机科学中扮演着重要的角色。通过递推,我们可以根据已知的初始条件,通过一定的规则推导出后续的结果,从而解决各种实际问题。本文将介绍递推算法的基础知识,并通过一些入门例题来帮助读者更好地理…...
超市销售数据-python数据分析项目
Python数据分析项目-基于Python的销售数据分析项目 文章目录 Python数据分析项目-基于Python的销售数据分析项目项目介绍数据分析结果导出数据查阅 数据分析内容哪些类别比较畅销?哪些商品比较畅销?不同门店的销售额占比哪个时间段是超市的客流高封期?查看源数据类型计算本月…...
java实现手机号,密码,游邮箱 , 验证码的正则匹配工具类
先定义一个抽象类RegexPatterns,定义相关正则字符串 : public abstract class RegexPatterns {/*** 手机号正则*/public static final String PHONE_REGEX "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/*** 邮箱正则*/public stat…...
java中的Arrays类的常用操作
Arrays类位于 java.util 包中,主要包含了操作数组的各种方法。 import java.util.Arrays; Arrays.sort(arr); int index Arrays.binarySearch(arr, 3); boolean isEqual Arrays.equals(arr1, arr2); // isEqual为true int[] arrnew int[5]; Arrays.fill(arr, 7)…...
回溯算法|78.子集
力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自…...
VC++、GCC、CLANG,INT128有符号整数编译器关键字
注意INT128为目标平台扩展关键字,不属于C/C语言本身支持特性,每个C/C编译器平台支持上都略有不同,甚至不支持。 可以详细参考本人此篇文章: GUN C/C (GCC/CLANG) 对于 __int128_t (128位有符号大整数的扩展支持平台限…...
用于HUD平视显示器的控制芯片:S2D13V40
一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display,即平视显示器,以前应用于军用飞机上,旨在降低飞行员需要低头查看仪表的频率。起初,HUD通过光学原理,将驾驶相关的信息投射…...
JSP使用模板字符串数据不能渲染的问题
entrap father 的 rubbish JSP 数据不能直接渲染,要从接口请求后去拼接结构 然后模板字符串不能直接用 用以下方法是不能渲染出数据的 let div <div class"circulation"><div class"list"><div class"left"><div class&qu…...
AI音乐GPT时刻来临:Suno 快速入门手册!
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
数字乡村发展蓝图:科技赋能农村实现全面振兴
目录 一、数字乡村发展蓝图的内涵与目标 二、科技赋能农村:数字乡村发展的动力与路径 (一)加强农业科技创新,提升农业生产效率 (二)推进农村电商发展,拓宽农民增收渠道 (三&…...
Day42 动态规划 part04
Day42 动态规划 part04 46. 携带研究材料(卡哥的卡码网的题目) 背包问题 我的思路: 写不了一点儿…T^T 总结规律就是,dp数组要比原来各个size 1,dp[i][j] Math.max(xxx, xxxx(根据题目情况进行各种处理)) 解答: …...
python set是什么类型
python set是一种数据类型,数学里的集合概念,在Python语言里对应的是set类型。与list,tuple不同的地方是,set更加强调的是一种“从属关系”(membership),跟顺序无关,所以有重复的元素…...
redis事务(redis features)
redis支持事务,也就是可以在一次请求中执行多个命令。redis中的事务主要是通过MULTI和EXEC这两个命令来实现的。 MULTI命令用来开启一个事务,事务开启之后,所有的命令就都会被放入到一个队列中,最后通过一个EXEC命令来执行事务中…...
SpringBoot整合minio
SpringBoot整合minio 1. 下载及安装1.1 windows版本1.2 Linux版本 2. SpringBoot整合minio2.1 依赖2.2 配置文件2.3 配置类2.4 工具类2.5 测试1. 业务层2. 控制层 1. 下载及安装 1.1 windows版本 目录结构 启动文件 标红的地方按实际安装地更改 echo off REM 声明采用UT…...
3090. 每个字符最多出现两次的最长子字符串
说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,…...
26.活锁、饥饿锁
两个线程,相互改变了对方结束条件,导致两个线程不能结束。执行时间也都是一样,导致两个线程永远不会结束。 Slf4j public class LiveLockDemo {static volatile int count 10;public static void main(String[] args) {new Thread(() ->…...
docker 安装nginx
一、先查看有没有nginx镜像 docker images 二、发现没有nginx镜像,下载最新镜像 docker pull nginx 三、运行镜像 为了先复制出部分文件,先启动一个临时容器 docker run --name nginx -p 9001:80 -d nginx docker cp nginx:/etc/nginx/conf.d /home/…...
2024年阿里云新用户便宜购买云服务器攻略:5大细节助你降低购买成本
随着互联网的蓬勃发展,无论是个人还是企业,拥有一个稳定且高效的网站或APP已成为提升竞争力的关键。为了将这些项目部署并运行起来,购买一台实用又便宜的云服务器是必不可少的。阿里云作为国内首屈一指的云服务提供商,自然成为了众…...
SSTI模板注入(jinja2)
前面学习了SSTI中的smarty类型,今天学习了Jinja2,两种类型都是flask框架的,但是在注入的语法上还是有不同 SSTI:服务器端模板注入,也属于一种注入类型。与sql注入类似,也是通过凭借进行命令的执行ÿ…...
ESP32学习---ESP-NOW(一)
ESP32学习---ESP-NOW(一) 官网简介arduino 官网简介 首先看官网的介绍:https://www.espressif.com.cn/zh-hans/solutions/low-power-solutions/esp-now ESP-NOW 是乐鑫定义的一种无线通信协议,能够在无路由器的情况下直接、快速…...
C++核心高级编程 --- 3、函数提高
文章目录 第三章:3.函数提高3.1 函数默认参数3.2 函数占位参数3.3 函数重载3.3.1 函数重载概述3.3.2 注意事项 第三章: 3.函数提高 3.1 函数默认参数 语法结构:返回值类型 函数名 (参数 默认值){} #include <iostream> using name…...
【微服务篇】深入理解分布式消息队列系统
分布式消息队列是一种在多个服务器、应用或服务之间进行消息传递的技术。它使得各个独立的组件可以通过异步消息进行通信,提高了系统的可扩展性、解耦性和可靠性。 典型应用场景 1. 异步处理 在许多系统中,某些任务的处理可能需要较长时间,…...
基于k8s的web服务器构建
文章目录 k8s综合项目1、项目规划图2、项目描述3、项目环境4、前期准备4.1、环境准备4.2、ip划分4.3、静态配置ip地址4.4、修改主机名4.5、部署k8s集群4.5.1、关闭防火墙和selinux4.5.2、升级系统4.5.3、每台主机都配置hosts文件,相互之间通过主机名互相访问4.5.4、…...
【名词解释】ImageCaption任务中的CIDEr、n-gram、TF-IDF、BLEU、METEOR、ROUGE 分别是什么?它们是怎样计算的?
CIDEr CIDEr(Consensus-based Image Description Evaluation)是一种用于自动评估图像描述(image captioning)任务性能的指标。它主要通过计算生成的描述与一组参考描述之间的相似性来评估图像描述的质量。CIDEr的独特之处在于它考…...
C++其他语法..
1.运算符重载 之前有一个案例如下所示 其中我们可以通过add方法将两个点组成一个新的点 class Point {friend Point add(Point, Point);int m_x;int m_y; public:Point(int x, int y) : m_x(x), m_y(y) {}void display() {cout << "(" << m_x <<…...
【Vue3源码学习】— CH2.6 effect.ts:详解
effect.ts:详解 1. 理解activeEffect1.1 定义1.2 通过一个例子来说明这个过程a. 副作用函数的初始化b. 执行副作用函数前c. 访问state.countd. get拦截器中的track调用e. 修改state.count时的set拦截器f. trigger函数中的依赖重新执行 1.3 实战应用1.4 activeEffect…...
C语言:文件操作(一)
目录 前言 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 结(一) 前言 本篇文章将介绍C语言的文件操作,在后面的内容讲到:为什么使用文…...
集中进行一系列处理——函数
需要多次执行相同的处理,除了编写循环语句之外,还可以集中起来对它进行定义。 对一系列处理进行定义的做法被称为函数,步骤,子程序。 对函数进行定一后,只需要调用该函数就可以了。如果需要对处理的内容进行修正&…...
独立网站建设步骤/网站维护一年一般多少钱?
1.增加utf8mb4的支持 SHOW VARIABLES WHERE Variable_name LIKE character% OR Variable_name LIKE collation%; 2.xtrabackup 因为测试环境都是5.7,所以需要升级。 具体步骤 mysql5.7 shell自动安装脚本 2.xtarbackup备份测试库,还原到现在的新安装的库…...
ps做的网站保存不了jpg/百度网盘登录首页
源:在 WindowMobile 上的模拟LED 显示屏插件 我在给一个对话框上的控件查找翻看合适的图标时,无形中看到了一个LED显示屏的图标,这里所说的LED显示屏是指由很多LED灯密集排列组成的点阵式LED屏,比如在股市交易所,公交车…...
做海报的话网站/关键词优化的技巧
首批中国人工智能产业发展联盟特约媒体以及联盟媒体专家委员会委员公布。 中国人工智能产业发展联盟媒体项目组成立会于2018年1月25日在京举行。会议由联盟办公室主任石霖主持。 我国人工智能领域进入了蓬勃发展阶段,各行各业形成了以人工智能为基础的科技创新体系…...
wordpress批量增加用户/北京百度推广代理
这几天在修改canal, 连接mysql和maria接收到的event有所区别 拿一个简单的insert sql来举例 mysql 会有以下几个event写入到binlog里 1.ANONYMOUS_GTID_LOG_EVENT2.QUERY_EVENTheader { version: 1 logfileName: "20170105-162017-bin.000001" logfileOffset: 192…...
网站建设2017排名/微信app小程序开发
昨天做了什么: 注册页面以及通过网上注册已基本完成 今天要做什么: 今天和明天都打算完成最后的连接数据库工作 遇到什么困难 目前没有转载于:https://www.cnblogs.com/bai123/p/7007429.html...
网站建设公司导航/公司网络推广网站
chrony有两个核心组件,分别是:chronyd:是守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率,并对此进行调整补偿。chronyc:提供一个用户界面,用于监控性…...