C/C++语言知识点二
1. 编程算法之“哨兵”思想
哨兵思想是一种编程技巧,通过在数据结构的边界或特定位置放置一个特殊值(称为“哨兵”),来简化逻辑判断和提高代码效率。哨兵通常是一个标记值,用于指示某种条件或边界,从而避免额外的边界检查或条件判断。
哨兵思想的应用场合:
-
数组或链表的遍历:在遍历数组或链表时,可以在末尾放置一个哨兵值,避免在每次循环中检查是否越界。
// 例如,在查找数组中的某个元素时,可以将目标值作为哨兵放在数组末尾,从而简化查找逻辑。 int find(int arr[], int n, int target) {int last = arr[n - 1]; // 保存最后一个元素arr[n - 1] = target; // 将目标值作为哨兵int i = 0;while (arr[i] != target) {i++;}arr[n - 1] = last; // 恢复最后一个元素if (i < n - 1 || arr[n - 1] == target) {return i; // 找到目标值}return -1; // 未找到 }
-
循环终止条件:
- 在循环中,哨兵可以作为终止条件,避免额外的判断。
- 例如,在读取用户输入时,可以使用特定的哨兵值(如
-1
或EOF
)来终止循环。int sum = 0; int value;while (true) {scanf("%d", &value);if (value == -1) { // -1 作为哨兵break;}sum += value; } printf("Sum: %d\n", sum);
-
排序算法:
- 在某些排序算法(如插入排序)中,哨兵可以减少比较次数。
- 例如,在插入排序中,可以将数组的第一个元素作为哨兵,避免每次比较时检查数组边界。
-
字符串处理:
- 在字符串处理中,哨兵可以标记字符串的结束位置。
- 例如,C 语言中的字符串以
\0
作为哨兵,表示字符串的结束。
-
图的遍历:在图算法中,哨兵可以标记节点的访问状态或边界。
2. Linux内核代码中的一个宏定义
代码:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
分析:
-
(TYPE *)0
:将地址0强制类型转换为TYPE
类型的指针。这里的0
代表一个空指针,但通过类型转换,它被当作TYPE
类型的对象来处理。 -
((TYPE *)0)->MEMBER
:通过上述转换得到的指针访问其MEMBER
成员。这一步实际上是在访问一个不存在的地址上的成员,但由于编译器在编译时会计算成员的偏移量,所以这一步是安全的。 -
&((TYPE *)0)->MEMBER
:获取MEMBER
成员变量的地址。由于MEMBER
是通过类型转换后的指针访问的,所以这个地址实际上是MEMBER
在TYPE
结构体中的偏移地址。 -
(size_t)&((TYPE *)0)->MEMBER
:将上述地址转换为size_t
类型的数据。size_t
是一个无符号整数类型,通常用于表示大小或偏移量。
总结:这个宏的作用是计算并返回 MEMBER
成员在 TYPE
结构体中的偏移量。这个偏移量是一个 size_t
类型的值,表示从结构体的起始地址到成员 MEMBER
的起始地址之间的字节数。
3. 64位和32位Linux系统字节对齐问题
代码分析:
#include <stdio.h>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)typedef struct s
{union{int a;char str[10];};struct s* next;
} S;int main()
{printf("%d\n", offsetof(S, next));return 0;
}
案例:
#include <stdio.h>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)typedef struct s
{union{int a;char str;};struct s* next;
} S;int main()
{printf("Size of S: %zu\n", sizeof(S));printf("Offset of next: %zu\n", offsetof(S, next));return 0;
}//结果32位、四字节对齐
Size of S: 16
Offset of next: 12//结果64位、八字节对齐
Size of S: 24
Offset of next: 16
4. const和指针的用法
在 C/C++ 中,const
关键字用于定义常量或指定某些数据不可修改。它可以应用于变量、指针、函数参数等,具有多种用法和含义。以下是 const
关键字的几种常见用法,特别是与指针结合时的不同含义:
1. 定义常量:const
可以用于定义常量,常量的值在定义后不能被修改。
const int MAX_VALUE = 100;特点:
定义时必须初始化。
不能通过赋值修改常量的值。
2. const
与指针:const
与指针结合时,可以有不同的含义,具体取决于 const
的位置。
(1) 指向常量的指针:
const int *pt;含义:pt 是一个指向 const int 的指针。指针可以指向不同的对象,但不能通过 pt 修改所指向的对象。示例:int a = 10;const int *pt = &a;// *pt = 20; // 错误:不能通过 pt 修改 aa = 20; // 正确:可以直接修改 a
(2) 常量指针:
int *const pt;含义:pt 是一个常量指针,指向 int 类型。指针的值(即指向的地址)不能修改,但可以通过 pt 修改所指向的对象。示例:int a = 10;int *const pt = &a;*pt = 20; // 正确:可以通过 pt 修改 a// pt = &b; // 错误:不能修改 pt 的值
(3) 指向常量的常量指针:
const int *const pt;含义:pt 是一个常量指针,指向 const int 类型。指针的值(即指向的地址)不能修改,也不能通过 pt 修改所指向的对象。示例:int a = 10;const int *const pt = &a;// *pt = 20; // 错误:不能通过 pt 修改 a// pt = &b; // 错误:不能修改 pt 的值
3. const
修饰函数参数:const
可以用于修饰函数参数,表示该参数在函数内部不能被修改。
(1) 修饰指针参数
void print(const int *arr, int size); // arr 是一个指向常量的指针,函数内部不能通过 arr 修改所指向的数据。
示例:
void print(const int *arr, int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}
}
(2) 修饰引用参数(C++)
void print(const std::string &str); // str 是一个常量引用,函数内部不能修改 str 的值
示例:
void print(const std::string &str) {std::cout << str;
}
4. const
修饰成员函数(C++):在 C++ 中,const
可以修饰类的成员函数,表示该函数不会修改类的成员变量。
class MyClass {
public:int getValue() const {return value;}
private:int value;
};// getValue 是一个常量成员函数,不能修改类的成员变量。
5. const
修饰返回值:const
可以用于修饰函数的返回值,表示返回值不能被修改。
const int* getPointer(); // 返回的指针指向的内容不能被修改。
6. const
修饰全局或局部变量:const
可以用于修饰全局或局部变量,表示变量的值不能被修改。
void func() {const int LOCAL_VALUE = 10;// LOCAL_VALUE = 20; // 错误:不能修改常量
}
总结:const
关键字的用法非常灵活,主要作用是保证数据的不变性。以下是一些常见的应用场景:
- 定义常量。
- 修饰指针,限制指针或指向数据的修改。
- 修饰函数参数,防止参数被修改。
- 修饰成员函数(C++),保证函数不修改对象状态。
- 修饰返回值,限制返回值的修改。
通过合理使用 const
,可以提高代码的安全性和可读性,避免意外的数据修改。
5. fork函数
分析代码:
int main() {fork() || fork();
}
-
fork()
的作用:fork()
创建一个新的进程(子进程),子进程是父进程的副本。fork()
在父进程中返回子进程的 PID(大于 0),在子进程中返回 0。- 如果
fork()
失败,返回 -1。
-
逻辑或运算符
||
的特性:A || B
:如果A
为真(非零),则不会执行B
(短路特性)。- 如果
A
为假(零),则继续执行B
。
进程创建过程:
-
第一次
fork()
:- 父进程调用
fork()
,创建一个子进程。 - 父进程中,
fork()
返回子进程的 PID(大于 0),因此fork() || fork()
的值为真,短路特性生效,不会执行第二个fork()
。 - 子进程中,
fork()
返回 0,因此fork() || fork()
的值为假,继续执行第二个fork()
。
- 父进程调用
-
第二次
fork()
:- 只有在第一次
fork()
创建的子进程中,才会执行第二个fork()
。 - 子进程调用
fork()
,创建另一个子进程(孙子进程)。 - 子进程中,
fork()
返回孙子进程的 PID(大于 0),因此fork() || fork()
的值为真,短路特性生效。 - 孙子进程中,
fork()
返回 0,因此fork() || fork()
的值为假。
- 只有在第一次
进程树结构:
父进程
|
├─ 子进程
| |
| └─ 孙子进程
|
└─ 子进程
进程总数:总共创建了 3 个进程。
- 父进程:1 个。
- 子进程:1 个。
- 孙子进程:1 个。
总结:
- 代码
fork() || fork()
会创建 3 个进程。 - 第一次
fork()
创建 1 个子进程。 - 第二次
fork()
在子进程中创建 1 个孙子进程。 - 父进程和子进程都会执行
fork()
,但由于逻辑或运算符的短路特性,父进程不会执行第二个fork()
。
6. 按指针引用值传递参数
代码分析: 下面这段代码的输出结果为:
#include <stdio.h>
void change(int *a, int &b, int c)
{c=*a;b=30;*a=20;
}int main ( )
{int a = 10, b = 20, c = 30;change(&a, b, c);printf( "%d, %d, %d, ", a, b, c);return 0;
}
1. 函数 change
的参数传递
int *a
:- 传递指针,函数内部可以通过指针修改
a
的值。
- 传递指针,函数内部可以通过指针修改
int &b
:- 传递引用(C++ 特性),函数内部可以直接修改
b
的值。
- 传递引用(C++ 特性),函数内部可以直接修改
int c
:- 传递值,函数内部对
c
的修改不会影响外部的c
。
- 传递值,函数内部对
2. 函数 change
的逻辑
void change(int *a, int &b, int c)
{c = *a; // 将指针 a 指向的值赋值给 c(局部变量,不影响外部的 c)b = 30; // 将引用 b 的值修改为 30*a = 20; // 将指针 a 指向的值修改为 20
}
3. main
函数的逻辑
int main()
{int a = 10, b = 20, c = 30;change(&a, b, c);printf("%d, %d, %d, ", a, b, c);return 0;
}
- 调用
change
函数:&a
传递a
的地址。b
传递b
的引用。c
传递c
的值。
change
函数执行后:*a = 20
修改了a
的值为20
。b = 30
修改了b
的值为30
。c = *a
修改了局部变量c
的值为10
,但外部的c
不受影响。
总结:
- 指针
int *a
:可以修改外部变量的值。 - 引用
int &b
:可以直接修改外部变量的值。 - 值传递
int c
:对局部变量的修改不影响外部变量。
最终输出结果为:20, 30, 30。
7. 调用几次构造函数
题目内容是:
若
MyClass
为一个类,执行MyClass a, *p;
语句时会自动调用该类构造函数的次数是()
选项:
- A: 2
- B: 5
- C: 4
- D: 9
解题思路:
-
MyClass a
:- 这是一个数组,包含 4 个
MyClass
对象。 - 每个对象在创建时都会调用构造函数,因此会调用 4 次构造函数。
- 这是一个数组,包含 4 个
-
MyClass *p
:- 这是一个指针数组,包含 5 个
MyClass
类型的指针。 - 指针本身是内置类型,不会调用
MyClass
的构造函数。 - 这些指针默认初始化为
nullptr
,不会创建MyClass
对象。
- 这是一个指针数组,包含 5 个
-
总结:
MyClass a
会调用 4 次构造函数。MyClass *p
不会调用构造函数。- 总共调用构造函数的次数是 4 次。
8. 统计二进制数中1的个数
题目内容是:
要求:求下面函数的返回值: int func(int x) {int countx = 0;while(x){countx++;x = x&(x-1);}return countx; }
这个函数的返回值是 整数 x
的二进制表示中 1
的个数。以下是详细分析:
解题思路:
-
x = x & (x - 1)
:- 这个操作会将
x
的二进制表示中最右边的1
置为0
。 - 例如:
- 如果
x = 12
(二进制1100
),则x - 1 = 11
(二进制1011
)。 x & (x - 1) = 1100 & 1011 = 1000
(二进制1000
)。- 下一次循环时,
x = 8
(二进制1000
),x - 1 = 7
(二进制0111
)。 x & (x - 1) = 1000 & 0111 = 0000
(二进制0000
)。- 循环结束。
- 如果
- 这个操作会将
-
countx++
:- 每次循环将
countx
加 1,表示找到了一个1
- 每次循环将
示例 1:
int x = 12; // 二进制 1100
int result = func(x);分析
第一次循环:x = 1100,x & (x - 1) = 1000,countx = 1。
第二次循环:x = 1000,x & (x - 1) = 0000,countx = 2。
循环结束,返回 2。
示例 2:
int x = 7; // 二进制 0111
int result = func(x);分析:
第一次循环:x = 0111,x & (x - 1) = 0110,countx = 1。
第二次循环:x = 0110,x & (x - 1) = 0100,countx = 2。
第三次循环:x = 0100,x & (x - 1) = 0000,countx = 3。
循环结束,返回 3。
9. 编写代码:判断一个数是不是2的N次方
方法 1:利用二进制特性
2 的 N 次方的二进制表示中,只有一个 1
,其余位都是 0
。例如:
1
(2⁰):0001
2
(2¹):0010
4
(2²):0100
8
(2³):1000
因此,判断一个数是否是 2 的 N 次方,可以检查它的二进制表示是否只有一个 1
。
#include <stdio.h>int isPowerOfTwo(int x) {// 如果 x 是 2 的 N 次方,则 x & (x - 1) == 0return x > 0 && (x & (x - 1)) == 0;
}int main() {int x;printf("Enter a number: ");scanf("%d", &x);if (isPowerOfTwo(x)) {printf("%d is a power of two.\n", x);} else {printf("%d is not a power of two.\n", x);}return 0;
}
解释:
x > 0
:确保x
是正整数。(x & (x - 1)) == 0
:如果x
是 2 的 N 次方,则x & (x - 1)
的结果为0
。
方法 2:循环除以 2
通过循环将 x
反复除以 2,如果最终结果为 1
,则 x
是 2 的 N 次方。
#include <stdio.h>int isPowerOfTwo(int x) {if (x <= 0) {return 0; // 非正整数不可能是 2 的 N 次方}while (x > 1) {if (x % 2 != 0) {return 0; // 如果不能被 2 整除,则不是 2 的 N 次方}x /= 2;}return 1; // 最终结果为 1,是 2 的 N 次方
}int main() {int x;printf("Enter a number: ");scanf("%d", &x);if (isPowerOfTwo(x)) {printf("%d is a power of two.\n", x);} else {printf("%d is not a power of two.\n", x);}return 0;
}
解释:
- 如果
x
能被 2 整除,则继续除以 2,直到x
变为1
。 - 如果在过程中
x
不能被 2 整除,则不是 2 的 N 次方。
方法 3:利用对数
如果 log₂(x)
是整数,则 x
是 2 的 N 次方。
#include <stdio.h>
#include <math.h>int isPowerOfTwo(int x) {if (x <= 0) {return 0; // 非正整数不可能是 2 的 N 次方}double log2x = log2(x);return log2x == (int)log2x; // 判断 log2x 是否为整数
}int main() {int x;printf("Enter a number: ");scanf("%d", &x);if (isPowerOfTwo(x)) {printf("%d is a power of two.\n", x);} else {printf("%d is not a power of two.\n", x);}return 0;
}
解释:
- 计算
log₂(x)
,如果结果是整数,则x
是 2 的 N 次方。
总结:
- 推荐方法:方法 1(利用二进制特性),效率最高,代码简洁。
- 其他方法:方法 2 和方法 3 也可以实现,但效率较低。
#include <stdio.h>#define ISPOWER_OF_TWO(x) ((x&(x-1))==0)int main(void)
{int n;printf("Please enter a number, n = ");scanf("%d", &n);if(ISPOWER_OF_TWO(n))printf("n is the power of two\n");elseprintf("n is not the power of two\n");return 0;
}
#include <stdio.h>#define ISPOWER_OF_TWO(x) ((x > 0) && ((x & (x - 1)) == 0))int main(void)
{int n;printf("Please enter a number, n = ");scanf("%d", &n);if(ISPOWER_OF_TWO(n))printf("n is the power of two\n");elseprintf("n is not the power of two\n");return 0;
}
相关文章:
C/C++语言知识点二
1. 编程算法之“哨兵”思想 哨兵思想是一种编程技巧,通过在数据结构的边界或特定位置放置一个特殊值(称为“哨兵”),来简化逻辑判断和提高代码效率。哨兵通常是一个标记值,用于指示某种条件或边界,从而避免…...
【SpringBoot】——分组校验、自定义注解、登入验证(集成redis)、属性配置方式、多环境开发系统学习知识
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
【EB-03】 AUTOSAR builder与EB RTE集成
AUTOSAR builder与EB RTE集成 1. Import Arxml files to Tresos2. Run MultiTask Script3. Add Components3.1 Run EcuExtractCreator Script4. Mapping Component to Partitions5. Event Mapping/Runnables Mapping to Tasks6. Port Connect7. Run SvcAs_Trigger Script8. Ver…...
布署elfk-准备工作
建议申请5台机器部署elfk: filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客,搜索人自己的社区 官方…...
JVM垃圾回收器深度底层原理分析与知识体系构建
一、垃圾回收的基本步骤 标记(Marking) 从GC Roots(如虚拟机栈、方法区静态变量、本地方法栈等)出发,遍历对象引用链,标记所有可达对象为存活对象,未被标记的则视为垃圾。此阶段需暂停用户线程&…...
Flutter系列教程之(5)——常用控件Widget的使用示例
目录 1.页面跳转 2.某个控件设置点击事件 3.AlertDialog对话框的使用 4.文本输入框 5.按钮 圆角扁平按钮: 圆角悬浮按钮: 6.补充 圆点 7.布局使用 Row控件左右对齐 调整边距 1.页面跳转 首先,先介绍一下页面跳转功能吧 Flutter使用 Navigator 进行页面…...
快手前端通用静态托管服务KFX演进历程:从崎岖土路到平坦高速
快手静态部署托管服务(KFX)历经四年发展,经历了三个阶段,一步步从勉强能行车的“崎岖土路”到现在多车道并行的“平坦高速”,这一转变极大地提升了资源利用率和效率,满足业务的实际需要。本文将带你了解其背…...
hackmyvm-buster
题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…...
React加TypeScript最新部署完整版
React TypeScript 全流程部署指南 一、环境准备与项目初始化 关于node.js及npm的安装请参见我的文章。 1.1 创建项目(React TypeScript) # 使用官方推荐脚手架(Vite 5.x) npx create-vitelatest my-app --template react-ts …...
DeepSeek-R1-Zero:基于基础模型的强化学习
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…...
python的列表和元组别再傻傻分不清啦
目录 什么是下标: 正数索引:正数索引从左到右,从 0 开始。 负数索引:负数索引从右到左,从 -1 开始。 切片(slice):除了单个元素,Python还支持通过切片访问序列的子集。…...
Fiddler在Windows下抓包Https
文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量(可选)解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下,Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密: 1…...
【超详细】神经网络的可视化解释
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
LVS+Keepalived 高可用集群搭建
一、高可用集群: 1.什么是高可用集群: 高可用集群(High Availability Cluster)是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响…...
使用git管理uniapp项目
1.本地管理 1. 在项目根目录中新建 .gitignore 忽略文件,并配置如下: # 忽略 node_modules 目录 /node_modules /unpackage/dist 2. 打开终端,切换到项目根目录中,运行如下的命令,初始化本地 Git 仓库࿱…...
回调函数的用法
回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数,接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性,下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...
样式垂直居中,谁才是王者
样式垂直居中,谁才是王者 面试官 常问如何让元素垂直居中,这其实是个经典的前端问题。 实现垂直居中的方法多种多样,从传统的表格布局到现代的Flexbox、Grid布局,再到绝对定位配合transform,甚至是line-height技巧&am…...
五、Three.js顶点UV坐标、纹理贴图
一部分来自1. 创建纹理贴图 | Three.js中文网 ,一部分是自己的总结。 一、创建纹理贴图 注意:把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意:将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…...
Linux Kernel Connection Tracking Table
在 Linux 内核中,连接跟踪表(Connection Tracking Table,简称 conntrack)是一个用于跟踪网络连接状态的核心组件。它主要由 Netfilter 框架管理,广泛应用于防火墙、NAT(网络地址转换)和负载均衡…...
NavVis VLX三维扫描:高层建筑数字化的革新力量【沪敖3D】
在三维激光扫描领域,楼梯结构因其复杂的空间形态和连续垂直移动的实际需求,一直是技术难点之一。利用NavVis VLX穿戴式移动扫描系统成功完成一栋34层建筑的高效扫描,其中楼梯部分的数据一遍成形且无任何分层或形变。本文将深入分析该项目的技…...
JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
生产问题定位指南:几款必备的可视化工具 引言 在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供…...
【深入理解JWT】从认证授权到网关安全
最近的项目学习中,在进行登陆模块的用户信息验证这一部分又用到了JWT的一些概念和相关知识,特在此写了这篇文章、方便各位笔者理解JWT相关概念 目录 先来理解JWT是什么? 区分有状态认证和无状态认证 有状态认证 VS 无状态认证 JWT令牌的…...
esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法
最近上手了正点原子esp32s3板子,环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试,每次都报这个错误无法建造。也不是网上说的ninja error,不是中文路径的问题。 在终端中查看,发现是缺少了git。(我这里没有…...
基于MATLAB红外弱小目标检测MPCM算法复现
摘要:本文详细介绍了一种基于人类视觉系统特性的红外弱小目标检测算法——Multiscale patch-based contrast measure (MPCM)。该算法通过增强目标与背景的对比度,有效检测红外图像中的弱小目标,并在MATLAB环境中进行了复现与实验验证。 关键…...
java基础面试篇
目录 1.概念 1.1说一下Java的特点 1.2Java为什么是跨平台的? 1.3 JVM、JDK、JRE三者关系? 1.4为什么Java解释和编译都有? 1.5 jvm是什么? 1.6 编译型语言和解释型语言的区别? 1.7 Python和Java区别是什么&#…...
Java Map实现类面试题
Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么? HashMap基于哈希表实现,使用数组链表红黑树(Java 8)的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…...
Vue2+Three.js加载并展示一个三维模型(提供Gitee源码)
目录 一、案例截图 二、安装Three.js 三、代码实现 四、Gitee源码 一、案例截图 二、安装Three.js npm install three 三、代码实现 模型资源我是放在public文件夹下面的: 完整代码: <template><div><div ref"container&qu…...
Spark内存并行计算框架
spark核心概念 spark集群架构 spark集群安装部署 spark-shell的使用 通过IDEA开发spark程序 1. Spark是什么 Apache Spark™ is a unified analytics engine for large-scale data processingspark是针对于大规模数据处理的统一分析引擎 spark是在Hadoop基础上的改进&…...
DeepSeek等LLM对网络安全行业的影响
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
【QT】QLinearGradient 线性渐变类简单使用教程
目录 0.简介 1)qtDesigner中 2)实际执行 1.功能详述 3.举一反三的样式 0.简介 QLinearGradient 是 Qt 框架中的一个类,用于定义线性渐变效果(通过样式表设置)。它可以用来填充形状、背景或其他图形元素࿰…...
可狱可囚的爬虫系列课程 15:防盗链反爬虫的处理
一、防盗链了解 防盗链是一种技术手段,主要用于防止其他网站通过直接链接的方式使用本网站的资源(如图片、文件等),从而节省带宽和服务器资源。当其他网站尝试直接链接到受保护的资源时,服务器会根据设置的规则判断请求…...
Vue组件:从使用到原理的深度解析
一、什么是Vue组件? 组件是Vue的核心特性之一,它允许开发者将UI拆分为独立可复用的代码片段。每个组件本质上是一个Vue实例,具有自己的: 模板(Template) 数据(Data) 方法…...
SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试
文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 index.html 三、页面调试3.1 参数提示3.2 开始请求3.3 手动断开 前言 作为一个Java程序员,了解前沿科技技术ÿ…...
Lua的table(表)
Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…...
图片爬取案例
修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…...
【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
idea + Docker + 阿里镜像服务打包部署
一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…...
C#模拟退火算法
模拟退火算法:寻找最优解的神奇 “退火之旅” 在生活中,我们都见过铁匠打铁。铁匠把烧得通红的铁块不断捶打,然后慢慢冷却,这样打造出来的金属制品才更坚固耐用。模拟退火算法就从这个退火过程中获得灵感,在计算机的数…...
网络安全防御模型
目录 6.1 网络防御概述 一、网络防御的意义 二、被动防御技术和主动防御技术 三、网络安全 纵深防御体系 四、主要防御技术 6.2 防火墙基础 一、防火墙的基本概念 二、防火墙的位置 1.防火墙的物理位置 2.防火墙的逻辑位置 3. 防火墙的不足 三、防火墙技术类型 四…...
APP自动化实战
APP自动化能做什么? 请看示例(实现批量的视频,封面功能复用能力(实现效果参考抖音号:71403700901) APP自动化实战-操作剪映APP PO模式 1. PO模式介绍 PO(Page Object)…...
Unity基础——资源导入
一.资源来源 1.Assert Store(Unity资源官方网站) (1)用于制作游戏的优质资源 | Unity Asset Store (2)或则通过Unity项目打开 2.外部资源 (1)淘宝 (2)找外…...
JMeter性能问题
性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…...
形式化数学编程在AI医疗中的探索路径分析
一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...
DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…...
nginx 配置https
参考文档:nginx 文档 -- nginx官网|nginx下载安装|nginx配置|nginx教程 配置 HTTPS 服务器 HTTPS 服务器优化 SSL 证书链 单个 HTTP/HTTPS 服务器 基于名称的 HTTPS 服务器 具有多个名称 的 SSL 证书 服务器名称指示 兼容性 要配置 HTTPS 服务器,ssl…...
GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用
GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用 目录 GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用GhostBottleneckInvertedResidualSqueeze and Excite(SE)GhostBottleneck 概念: GhostBottleneck 是在轻量级神经网…...
Docker启动ES容器打包本地镜像
文章目录 1、安装 Docker2、下载镜像3、查看已下载的镜像4、 保存和加载镜像5、.tar 文件与 Docker 镜像的关系6、如何从 .tar 文件加载 Docker 镜像7、为什么需要 .tar 文件?8、ES 8.x版本无法启动8.1 问题原因8.2 解决方案8.3 提交容器为新镜像 1、安装 Docker 如…...
XXE漏洞:原理、危害与修复方法详解
目录 一、XXE漏洞概述二、XXE漏洞原理三、XXE漏洞危害1. 任意文件读取2. 命令执行3. 拒绝服务攻击(DoS)4. SSRF攻击四、XXE漏洞修复方法1. 禁用外部实体JavaPythonPHP2. 输入验证和过滤3. 安全配置服务器4. 升级解析器版本五、总结一、XXE漏洞概述 XXE(XML External Entity…...
android keystore源码分析
架构 Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元,以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库,密钥库服务使用它来提供由硬件支持的加密服…...
状态模式
状态(State)模式属于行为型模式的一种。 状态模式允许对象在其内部状态改变时改变其行为,使其看上去就像改变了自身所属的类一样。 状态模式是为了把一大串if...else...的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。…...