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

【C++】入门(二):引用、内联、auto

书接上回:【C++】入门(一):命名空间、缺省参数、函数重载

文章目录

  • 六、引用
    • 引用的概念
    • 引用的使用场景
      • 1. 引用做参数
        • 作用1:输出型参数
        • 作用2:对象比较大,减少拷贝,提高效率
      • 2. 引用作为返回值
        • 错误示范
        • 正确示范
      • 3.总结引用的价值
    • 引用特性
    • 引用和指针的区别(面试题)
    • 常引用
  • 七、内联函数
      • 回顾:C语言如何避免函数频繁调用的问题?
      • 面试题1:实现两个数相加的宏函数
      • 面试题2:宏的优缺点
      • 面试题3:C++有哪些技术替换宏?
    • 内联的概念
    • 内联函数的缺点
      • 使用内联:vs:不使用内联
      • 为什么做声明和定义分离?
      • 总结:解决重定义的方案?
  • 八、auto关键字
    • 简介
    • 使用细则
    • auto不能推导的场景
  • 九、基于范围的for循环(C++11)
  • 十、指针空值nullptr(C++11)

六、引用

引用的概念

引用就是给已经存在的变量 取别名。编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

引用的使用场景

1. 引用做参数

作用1:输出型参数

学习C的时候 写Swap()函数 通过传实参地址的方式,使用指针交换两个变量里面的值 。而加入引用这个语法,则通过别名的方式 交换两个变量里面的值。

  void Swap(int* a, int *b){//...}void Swap(int& a, int &b){int tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;Swap(&x, &y);Swap(x, y);return 0;}
作用2:对象比较大,减少拷贝,提高效率

对象较大的情况下,对比传值传参 和 传引用传参 的代码效率

#include <time.h>
#include<iostream>
using namespace std;
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void main()
{A a;// 以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}

我们可以看到一个40000字节的对象,分别使用传值传参、传引用传参,且传参次数10000次。两种传参方式使用的时间有一定差异。引用作为函数参数 消耗的时间小于1 ms,所以是0。
演示结果
总结:这些使用场景,指针也可以适应,但是引用更方便

2. 引用作为返回值

错误示范
  • 一般情况
    1️⃣ 被调函数传值返回。 返回a的拷贝 寄存在寄存器里的临时空间 函数栈帧销毁之前 这块要返回的临时空间就已经生成好了
    在这里插入图片描述
int func()
{int a = 0;return a;
}
int main()
{int ret = func();cout << ret << endl;return 0;
}
  • 错误使用引用的情况
    2️⃣ 被调函数func传引用返回。 返回a的别名 但函数调用结束,栈帧销毁,a的别名还在访问这个空间——野引用
    在这里插入图片描述
int& func()
{int a = 0;return a;
}int main()
{int ret = func();cout << ret << endl;return 0;
}

3️⃣被调函数传引用返回 ,主函数引用接收。返回a的别名、用a的别名接收,意味着ret也是a的别名,但栈帧结束,变量a已经被销毁了,ret还回去访问那块空间,所以ret是野引用。
在这里插入图片描述

int& func()
{int a = 0;return a;
}int main()
{int& ret = func();cout << ret << endl;return 0;
}

结论:返回变量出了函数作用域就生命周期就结束了,所以不能用引用返回

正确示范

什么情况下,可以用引用返回?
答:全局变量、静态变量、堆上变量 可以用引用返回

🌰 实际场景中的例子:
使用引用语法修改用C语言写的链表

struct SeqList
{int* a;int size;int capacity;
};void SLInit(SeqList& sl)
{sl.a = (int*)malloc(sizeof(int) * 4);// ..sl.size = 0;sl.capacity = 4;
}void SLPushBack(SeqList& sl, int x)
{//...扩容sl.a[sl.size++] = x;
}// 修改
void SLModity(SeqList& sl, int pos, int x)
{assert(pos >= 0);assert(pos < sl.size);sl.a[pos] = x;
}int SLGet(SeqList& sl, int pos)
{assert(pos >= 0);assert(pos < sl.size);return sl.a[pos];
}int main()
{SeqList s;SLInit(s);SLPushBack(s, 1);SLPushBack(s, 2);SLPushBack(s, 3);SLPushBack(s, 4);for (int i = 0; i < s.size; i++){cout << SLGet(s, i) << " ";}cout << endl;for (int i = 0; i < s.size; i++){int val = SLGet(s, i);if (val % 2 == 0){SLModity(s, i, val * 2);}}cout << endl;for (int i = 0; i < s.size; i++){cout << SLGet(s, i) << " ";}cout << endl;return 0;
}

演进为C++玩法的版本
C++中结构体中可以定义函数 ➡️ 类 成员变量 、 成员函数

// C++
struct SeqList
{// 成员变量int* a;int size;int capacity;// 成员函数void Init(){a = (int*)malloc(sizeof(int) * 4);// ...size = 0;capacity = 4;}void PushBack(int x){// ... 扩容a[size++] = x;}// 读写返回变量int& Get(int pos){assert(pos >= 0);assert(pos < size);return a[pos];}int& operator[](int pos){assert(pos >= 0);assert(pos < size);
return a[pos];}
};
int main()
{SeqList s;s.Init();s.PushBack(1);s.PushBack(2);s.PushBack(3);s.PushBack(4);for (int i = 0; i < s.size; i++){//cout << s.Get(i)<< " ";cout << s[i] << " ";//cout << s.operator[](i) << " ";}cout << endl;for (int i = 0; i < s.size; i++){/*if (s.Get(i) % 2 == 0){s.Get(i) *= 2;}*/if (s[i] % 2 == 0){s[i] *= 2;}}cout << endl;for (int i = 0; i < s.size; i++){cout << s.Get(i) << " ";}cout << endl;return 0;
}

3.总结引用的价值

1️⃣引用做参数
🅰️可以作为输出型参数 。🅱️对象较大,减少拷贝提高效率
2️⃣做返回值
🅰️修改返回对象。 🅱️减少拷贝提高效率

引用特性

  1. 引用必须初始化:定义的引用的时候就要确定该引用是谁的别名

  2. 引用定义后,不能改变指向

  3. 一个变量可以有多个引用 、多个别名

int main()
{int a = 0;// 1、引用必须初始化//int& b;// b = c;// 2、引用定义后,不能改变指向int& b = a;int c = 2;b = c;  // 不是改变指向,而是赋值// 3、一个变量可以有多个引用,多个别名int& d = b;return 0;
}

思考:引用可以替代指针吗?
答:引用不能完全替代指针,指针和引用的功能是类似的,C++的引用,对指针使用比较复杂的场景进行一些替换,让代码更简单易懂,但是不能完全替代指针,引用不能完全替代指针原因:引用定义后,不能改变指向

🌰引用不可以替代指针的栗子:
双向链表中,必须要改变指向,但引用不能改变指向。
在这里插入图片描述
🌰C++的引用 对指针使用比较复杂的场景 可以进行一些替换:
例如:
原来C语言 写链表头插入 实参传头节点指针 的 地址 。形参需要用二级指针接收。

void PushBack(struct Node* phead, int x)
{// phead = newnode;
}void PushBack(struct Node** pphead, int x)
{// *pphead = newnode;
}

现在C++ 使用引用: 给指针类型的变量(头节点指针)取别名

void PushBack(struct Node*& phead, int x)
{//phead = newnode;
}int main()
{struct Node* plist = NULL;return 0;
}

📘杂七杂八的小知识点:数据结构教科书常见代码解读

//给 结构体 重命名为LNode 
//给 结构体类型的指针 重命名为 PNode
typedef struct Node
{struct Node* next;struct Node* prev;int val;
}LNode, *PNode;
//PNode& phead  给PNode变量(结构体类型的指针)取别名 phead 
void PushBack(PNode& phead, int x)
{//phead = newnode;//给引用赋值相当于改变PushBack()函数外面的链表头结点指针的指向
}

引用和指针的区别(面试题)

从两个维度对比 语法角度、底层角度对比

语法:
1. 引用是别名,不开空间。指针是地址,语法上需要开空间存储地址
2. 引用必须初始化 、指针可以初始化也可以不初始化。
3. 引用不可以改变指向、指针可以改变指向
4. 引用相对更安全 ,没有空引用、但是有空指针,容易出现野指针,不容易出现野引用

底层:
汇编层面上,没有引用,引用都是用指针实现的,引用编译后也转换成指针了

调到反汇编调试观察:

在这里插入图片描述
结论:底层都需要开空间1、引用在底层是用指针实现的。2、语法含义和底层实现是背离的

常引用

由于引用存在一些隐患,所以我们可以加关键字const 使用常引用 。例如下面代码,对于变量b,它是a的别名,如果对引用b修改, 那么a的值就会改变。但是如果不希望a的值被修改,我们就可以给引用前面加上const 使得引用只有读取a的值的权限,但不能修改。例如,a的引用c就是这样的权限。

int main()
{int a = 0;//eg.1权限正常的引用 int &b =a;//b对a可读可写b++;//eg.2权限缩小const int& c = a;//c对a只有读取权限//eg.3权限放大(错误示范)const int x = 10;//int& y = x;  //注意不能权限放大//eg.4 权限平移(正确示范)const int& y = x //y可以读取x的值//eg.5 const int& z =10; //z是常量的别名//eg.6const int& m = a+x;// a+x表达式的返回值 是一个临时变量 临时变量具有常性//eg.7 (错误示范)int& n = a+x;return 0;
}

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

七、内联函数

回顾:C语言如何避免函数频繁调用的问题?

➡️宏

面试题1:实现两个数相加的宏函数

#define Add(x,y) ((x)+(y))

易错点:1、宏不是函数 2、不要写分号 3、括号控制优先级

核心点:宏是预处理阶段进行替换

提问:为什么要加里面的括号?
答:因为x、y可能不是被单一变量所替换,而是其他表达式替换x、y ,防止表达式中的个别值先进性加法运算,从而运算符执行顺序和预期不符,导致运算结果错误。

面试题2:宏的优缺点

缺点:
1️⃣坑很多,不易控制 2️⃣ 不能调试 3️⃣没有安全类型的检查
优点:
增强代码复用性、提高效率

面试题3:C++有哪些技术替换宏?

  1. 常量定义 换用 const enum
  2. 短小函数定义 使用内联inline修饰

内联的概念

内联 : 在调用地方展开 。所指的展开就是:不建立栈帧,在当前函数的栈帧里执行要调用函数的代码

反汇编演示 具体是如何不建立栈帧展开的
图片
思考:能不能为所有函数 都加上inline ?
不行 ,➡️ 内联函数的缺点

内联函数的缺点

使用内联🆚不使用内联

假设func()函数100 行代码,并且一共要调用1w次分别考虑使用内联 、不使用内联的情况合计起来有多少指令?
使用内联

假设inline展开,合计指令数目为:100*1w。意味着 最后的可执行程序会变得很大

​解释:100行代码在1W个位置调用,那么1w个位置都会多出100行,所以就是100W行
不使用内联

假设inline不展开,合计指令数目:100+1w

解释:1W个位置调用 底层就会是汇编指令 call func(),call func()后会从符号表找到这个函数的地址 然后去执行该函数的代码。

总结:由此可见,如果是代码量较大的函数 使用inline 内联展开调用的话,会造成代码膨胀。所以内联函数只适合加在代码量较小的函数上!

注意:
1.inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
2.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就无法找到该函数。

为什么做声明和定义分离?

如果在头文件中进行函数定义,以下代码存在函数名重定义的问题

问题分析
Stack.cpp 包含了头文件 Test.cpp也包含了头文件。头文件的包含 在预处理阶段 会进行内容替换。也就是说Add()函数被定义两次。Stack.cpp Test.cpp 会分别产生Stack.o、Test.o。链接的时候 会把他们的符号表合并在一起,各自都有叫函数名修饰过的Add()函数,编译器就会认为函数重定义。

所以我们要做声明和定义分离!

//Stack.h
#progam once
#include<iostream>
using namespace std
int Add(int a,int b)
{cout<<"int Add(int a,int b)"<<endl;return a+b;
}
//Stack.cpp
#include"Stack.h"
//Test.cpp
#include"Stack.h"
int main()
{Add(1,2);return 0;
}

总结:解决重定义的方案?

1.声明和定义分离

2.Static,改变链接属性,该函数地址不会加入符号列表,只在当前文件可见。(适用于大函数)

3.使用内联函数,因为要在调用处展开,所以该函数地址也不会加入符号列表。(适用于小函数)

//Stack.h
#progam once
#include<iostream>
using namespace std
inline int Add(int a,int b)
{cout<<"int Add(int a,int b)"<<endl;return a+b;
}
//Stack.cpp
#include"Stack.h"
//Test.cpp
#include"Stack.h"
int main()
{Add(1,2);return 0;
}

八、auto关键字

简介

C++11规定,程序员使用auto关键字就可以不指定数据类型,编译器通过右边的值的类型自动推导出左边值的数据类型。使用auto关键字 必须初始化,因为在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

使用细则

1.auto与指针和引用结合起来使用
auto* 必须初始化为指针 ,auto声明引用类型时则必须加&
🌰栗子

auto p1 = &i
auto* p2 = &i;
//auto* p3 = i;//会报错
auto& r = a;

2.当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

void TestAuto()
{auto a = 1, b = 2; auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

auto不能推导的场景

1、auto不能作为函数的参数

// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a) 
{} 

2、auto不能直接用来声明数组

void TestAuto() 
{ 
int a[] = {1,2,3}; 
auto b[] = {456};
} 

3、为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

4、auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有 lambda表达式等进行配合使用

九、基于范围的for循环(C++11)

依次取数组中值赋值给e,自动迭代,自动判断结束

for (auto e : array)
{cout << e << " ";
}
cout << endl;

十、指针空值nullptr(C++11)

C语言中 我们这样初始化指针:

int* p1 = NULL;

但在C++中, NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

 #ifndef NULL#ifdef __cplusplus#define NULL    0#else#define NULL    ((void *)0)#endif#endif

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:类型匹配的问题

void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的 初衷相悖。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器 默认情况下将其看成是一个整形常量,*如果要将其按照指针方式来使用,必须对其进行强转(void )0

注意:

1、在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。 比特就业课

2、在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

3、为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

相关文章:

【C++】入门(二):引用、内联、auto

书接上回&#xff1a;【C】入门&#xff08;一&#xff09;&#xff1a;命名空间、缺省参数、函数重载 文章目录 六、引用引用的概念引用的使用场景1. 引用做参数作用1&#xff1a;输出型参数作用2&#xff1a;对象比较大&#xff0c;减少拷贝&#xff0c;提高效率 2. 引用作为…...

编程学习 (C规划) 6 {24_4_18} 七 ( 简单扫雷游戏)

首先我们要清楚扫雷大概是如何实现的&#xff1a; 1.布置雷 2.扫雷&#xff08;排查雷&#xff09; &#xff08;1&#xff09;如果这个位置是雷就炸了&#xff0c;游戏结束 &#xff08;2&#xff09;如果不是雷&#xff0c;就告诉周围有几个雷 3.把所有不是雷的位置都找…...

【AI】llama-fs的 安装与运行

pip install -r .\requirements.txt Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows(venv) PS D:\XTRANS\pythonProject>...

Android NDK系列(五)内存监控

在日常的开发中&#xff0c;内存泄漏是一种比较比较棘手的问题&#xff0c;这是由于其具有隐蔽性&#xff0c;即使发生了泄漏&#xff0c;很难检测到并且不好定位到哪里导致的泄漏。如果程序在运行的过程中不断出现内存泄漏&#xff0c;那么越来越多的内存得不到释放&#xff0…...

软件设计师,下午题 ——试题六

模型图 简单工厂模式 工厂方法模式抽象工厂模式生成器模式原型模式适配器模式桥接模式组合模式装饰&#xff08;器&#xff09;模式亨元模式命令模式观察者模式状态模式策略模式访问者模式中介者模式 简单工厂模式 工厂方法模式 抽象工厂模式 生成器模式 原型模式 适配器模式 桥…...

《Kubernetes部署篇:基于麒麟V10+ARM64架构部署harbor v2.4.0镜像仓库》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、环境信息 K8S版本 操作系统 CPU架构 服务版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…...

远程工作/线上兼职网站整理(数字游民友好)

文章目录 国外线上兼职网站fiverrupwork 国内线上兼职网站甜薪工场猪八戒网云队友 国外线上兼职网站 fiverr https://www.fiverr.com/start_selling?sourcetop_nav upwork https://www.upwork.com/ 国内线上兼职网站 甜薪工场 https://www.txgc.com/ 猪八戒网 云队友 …...

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester&#xff08;补全建议&#xff09; Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能&#xff0c;引导用户在输入时找到相关结果&#xff0c;提高搜索精度。 理想情况下&#xff0c;自动补…...

掌握正则表达式的力量:全方位解析PCRE的基础与进阶技能

Perl 兼容正则表达式&#xff08;PCRE&#xff09;是 Perl scripting language 中所使用的正则表达式语法标准。这些正则表达式在 Linux 命令行工具&#xff08;如 grep -P&#xff09;及其他编程语言和工具中也有广泛应用。以下是一些基础和进阶特性&#xff0c;帮你掌握和使用…...

FastFM库,一款强大神奇的Python系统分析预测的工具

FastFM库概述 在机器学习领域,Factorization Machines&#xff08;FM&#xff09;是处理稀疏数据集中特征间交互的重要工具.Python的fastFM库提供了高效的实现,特别适合用于推荐系统、评分预测等任务.本文将全面介绍fastFM的安装、特性、基本和高级功能,并结合实际应用场景展示…...

R语言绘图 --- 饼状图(Biorplot 开发日志 --- 2)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形&#xff0c;如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包&#xff08;Biorplot&#xff09;&#xff0c;用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…...

用于日常任务的实用 Python 脚本

Python 是一种多功能编程语言&#xff0c;以其简单易读而闻名。它广泛应用于从 Web 开发到数据分析等各个领域。Python 脚本&#xff0c;它们可以通过自动执行常见任务来使您的生活更轻松。 用于日常任务的实用 Python 脚本 1. 使用 Pandas 进行数据分析2. 使用 BeautifulSoup …...

7-Zip是什么呢

1. 简介 7-Zip 是一个功能强大、免费开源的文件压缩和解压缩工具&#xff0c;适用于个人用户和企业用户&#xff0c;可以在多种操作系统上进行使用&#xff0c;并且支持广泛的压缩格式和高级功能。 2. 特点与优势 开源免费&#xff1a;7-Zip 是免费的开源软件&#xff0c;可…...

Satellite Stereo Pipeline学习

1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况&#xff0c;基本上哪个包出问题…...

linux-gpio

在Linux shell中测试GPIO通信&#xff0c;通常需要使用GPIO的设备文件&#xff0c;这些文件通常位于/sys/class/gpio目录下。要使用特定的GPIO引脚&#xff0c;比如GPIO92&#xff0c;你需要执行以下步骤&#xff1a; 导出GPIO引脚&#xff1a;首先&#xff0c;需要确保GPIO92已…...

C# 代码配置的艺术

文章目录 1、代码配置的定义及其在软件工程中的作用2、C# 代码配置的基本概念和工具3、代码配置的实践步骤4、实现代码配置使用属性&#xff08;Properties&#xff09;使用配置文件&#xff08;Config Files&#xff09;使用依赖注入&#xff08;Dependency Injection&#xf…...

268 基于matlab的模拟双滑块连杆机构运动

基于matlab的模拟双滑块连杆机构运动&#xff0c;并绘制运动动画&#xff0c;连杆轨迹可视化输出&#xff0c;并输出杆件质心轨迹、角速度、速度变化曲线。可定义杆长、滑块速度&#xff0c;滑块初始位置等参数。程序已调通&#xff0c;可直接运行。 268 双滑块连杆机构运动 连…...

进口铝合金电动隔膜泵

进口铝合金电动隔膜泵是一种高效、可靠的工业泵&#xff0c;其特点、性能与应用广泛&#xff0c;以下是对其的详细分析&#xff1a; 特点 材质与结构&#xff1a; 采用铝合金材料制造&#xff0c;具有良好的耐腐蚀性和轻量化特点。铝合金材质使得泵体结构紧凑、轻便&#xff…...

G4 - 可控手势生成 CGAN

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 代码总结与心得 代码 关于CGAN的原理上节已经讲过&#xff0c;这次主要是编写代码加载上节训练后的模型来进行指定条件的生成 图像的生成其实只需要使用…...

使用 DuckDuckGo API 实现多种搜索功能

在日常生活中&#xff0c;我经常使用搜索引擎来查找信息&#xff0c;如谷歌和百度。然而&#xff0c;当我想通过 API 来实现这一功能时&#xff0c;会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容&#xff0c;并…...

【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目

文章目录 DrissionPage爬虫库简介1. 浏览器操控模式&#xff08;类似于游戏中的后台模拟鼠标键盘&#xff09;2. 数据包收发模式&#xff08;类似于游戏中的协议封包&#xff09; 实战中学习需求&#xff1a;爬取Gitee开源项目的标题与描述解决方案1&#xff1a;用数据包方式获…...

leetcode 115.不同的子序列

思路&#xff1a;LCS类dp 这道题的思考思路其实就是把以两个字符串结尾作为状态方程。 dp[i][j]的意义就是在s字符串在以s[i]结尾的字符串的情况下&#xff0c;所能匹配出t字符串以t[j]结尾的字符串个数。 本质上其实是一个LCS类的状态方程&#xff0c;只不过是意义不一样了…...

二叉树的顺序实现-堆

一、什么是堆 在数据结构中&#xff0c;堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;用数组存储&#xff0c;通常被用来实现优先队列。 堆具有以下特点&#xff1a; 堆是一棵完全二叉树&#xff08;Complete Binary Tree&#xff09;&#xff0c;即…...

【Maven】Maven主要知识点目录整理

1. Maven的基本概念 作者相关文章链接&#xff1a; 1、【Maven】简介_下载安装-CSDN博客 定义&#xff1a;Maven是Apache的一个开源项目&#xff0c;是Java开发环境中用于管理和构建项目&#xff0c;以及维护依赖关系的强大软件项目管理工具。作用&#xff1a;简化了项目依赖…...

Coolmuster Android Assistant: 手机数据管理的全能助手

在数字化时代&#xff0c;智能手机不仅是通讯工具&#xff0c;更是个人数据的中心。随着数据量的不断增加&#xff0c;如何有效管理和保护这些数据成为了一个重要议题。Coolmuster Android Assistant应运而生&#xff0c;它是一款专为安卓用户设计的综合数据管理软件&#xff0…...

03-树3 Tree Traversals Again(浙大数据结构PTA习题)

03-树3 Tree Traversals Again 分数 25 作者 陈越 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, th…...

Java项目对接redis,客户端是选Redisson、Lettuce还是Jedis?

JAVA项目对接redis&#xff0c;客户端是选Redisson、Lettuce还是Jedis&#xff1f; 一、客户端简介1. Jedis介绍2. Lettuce介绍3. Redisson介绍 二、横向对比三、选型说明 在实际的项目开发中&#xff0c;对于一个需要对接Redis的项目来说&#xff0c;就面临着选择合适的Redis客…...

AngularJS Web前端框架:深入探索与应用实践

AngularJS Web前端框架&#xff1a;深入探索与应用实践 AngularJS&#xff0c;作为一款强大的Web前端框架&#xff0c;为开发者提供了丰富的功能和工具&#xff0c;使得构建复杂且交互性强的Web应用变得更为便捷。本文将从四个方面、五个方面、六个方面和七个方面对AngularJS进…...

SQL 入门:使用 MySQL 进行数据库操作

SQL 入门&#xff1a;使用 MySQL 进行数据库操作 目录 引言SQL 基础 SQL 语言概述MySQL 简介 数据库设计基础 数据库与表的设计常见数据类型 MySQL 安装与配置 安装 MySQL基本配置与连接 基本 SQL 语句 数据库的创建与删除表的创建、修改与删除数据插入、更新与删除 数据查询…...

window安装ffmpeg播放本地摄像头视频

1、安装ffmpeg ffmpeg官方网站&#xff1a;FFmpeg 下载后解压文件夹名为ffmpeg 2、设置环境变量 目录 1、安装ffmpeg 设置环境变量 以F:\software\after\ffmpeg\bin为例 在命令行中输入ffmpeg出现下方代表安装成功 3、通过ffmpeg播放本地电脑摄像头 鼠标右击开始按钮&…...

【嵌入式DIY实例】-OLED显示网络时钟

OLED显示网络时钟 文章目录 OLED显示网络时钟1、硬件准备与接线2、代码实现在上一个ESP8266 NodeMCU文章中,我们用DS3231 RTC芯片和SSD1306 OLED制作了一个简单的实时时钟,时间和日期显示在SSD1306屏幕上,并且可以通过两个按钮进行设置。 在本中,我们将使用ESP 8266 NodeMC…...

【线程相关知识】

今日内容概要 开启线程的两种方式TCP服务端实现并发效果线程对象的join方法线程间数据共享线程对象属性及其他方法守护线程线程互斥锁GIL全局解释器锁多进程与多线程的实际应用场景 今日内容详细 开启线程的两种方式 # import time # from multiprocessing import Process #…...

鸿蒙ArkTS声明式开发:跨平台支持列表【透明度设置】 通用属性

透明度设置 设置组件的透明度。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版…...

【SQL学习进阶】从入门到高级应用(九)

文章目录 子查询什么是子查询where后面使用子查询from后面使用子查询select后面使用子查询exists、not existsin和exists区别 union&union alllimit &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面…...

Web前端三大主流框架技术分享

在当今快速发展的互联网时代&#xff0c;Web前端技术作为连接用户与服务的桥梁&#xff0c;其重要性不言而喻。随着技术的不断进步&#xff0c;为了提升开发效率、优化用户体验&#xff0c;一系列强大的前端框架应运而生。其中&#xff0c;Angular、React和Vue.js作为当前最为主…...

dockers安装mysql

1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址&#xff1a;https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例&#xff0c;并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…...

100道面试必会算法-27-美团2024面试第一题-前缀和矩阵

100道面试必会算法-27-美团2024面试第一题-前缀和矩阵 问题解读 给定一个 n x n 的二进制矩阵&#xff0c;每个元素是 0 或 1。我们的任务是计算矩阵中所有边长为 k 的子矩阵中&#xff0c;包含特定数量 1 的情况。例如&#xff0c;我们希望找到所有边长为 k 的子矩阵中包含 k…...

从摇一摇到弹窗,AD无处不在?为了不再受打扰,推荐几款好用的屏蔽软件,让手机电脑更清爽

当我们沉浸在智能手机带来的便捷与乐趣中时&#xff0c;内置AD如同不速之客&#xff0c;时常打断我们的体验。 尤其是手机上那些“摇一摇”跳转&#xff0c;稍有不慎就会跳转到其他应用&#xff0c;令人不胜其烦。同样&#xff0c;电脑上的内置AD也如影随形&#xff0c;影响了我…...

HackTheBox-Machines--Nibbles

Nibbles 测试过程 1 信息收集 NMAP 80 端口 网站出了打印出“Hello world&#xff01;”外&#xff0c;无其他可利用信息&#xff0c;但是查看网页源代码时&#xff0c;发现存在一个 /nibbleblog 文件夹 检查了 http://10.129.140.63/nibbleblog/ &#xff0c;发现了 /index.p…...

东方博宜1703 - 小明买水果

问题描述 小明去超市买了若干斤水果&#xff0c;你能根据水果的单价&#xff0c;小明买的水果数量&#xff0c;编一个程序计算出总金额&#xff0c;并打印出清单。 输入 输入两个值&#xff0c; 第一个为商品的单价&#xff0c;是一个小数。 第二个为商品的数量&#xff0c;…...

mac电脑用谷歌浏览器对安卓手机H5页面进行inspect

1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑&#xff1a;使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面&#xff0c;点击inspect&#xff0c;就能像谷歌浏览器页面打开下面的页面&#…...

动手学深度学习(Pytorch版)代码实践-深度学习基础-01基础函数的使用

01基础函数的使用 主要内容 张量操作&#xff1a;创建和操作张量&#xff0c;包括重塑、填充、逐元素操作等。数据处理&#xff1a;使用pandas加载和处理数据&#xff0c;包括处理缺失值和进行one-hot编码。线性代数&#xff1a;包括矩阵运算、求和、均值、点积和各种范数计算…...

vm-bhyve:bhyve虚拟机的管理系统@FreeBSD

先说情况&#xff0c;当前创建虚拟机后网络没有调通....不明白是最近自己点背&#xff0c;还是确实有难度... 缘起&#xff1a; 前段时间学习bhyve虚拟机&#xff0c;发现bvm这个虚拟机管理系统&#xff0c;但是实践下来发现网络方面好像有问题&#xff0c;至少我花了两天时间…...

【Java】刚刚!突然!紧急通知!垃圾回收!

【Java】刚刚&#xff01;突然&#xff01;紧急通知&#xff01;垃圾回收&#xff01; 文章目录 【Java】刚刚&#xff01;突然&#xff01;紧急通知&#xff01;垃圾回收&#xff01;从C语言的内存管理引入&#xff1a;手动回收Java的垃圾回收机制引用计数器循环引用问题 可达…...

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列&#xff1a; 相对顺序是跟源字符串/数组是一致的但是元素和元素之间&#xff0c;在源字符串/数组中可以是不连续的一般时间…...

【稳定检索】2024年心理学与现代化教育、媒体国际会议(PMEM 2024)

2024年心理学与现代化教育、媒体国际会议 2024 International Conference on Psychology and Modern Education and Media 【1】会议简介 2024年心理学与现代化教育、媒体国际会议即将召开&#xff0c;这是一场汇聚全球心理学、教育及媒体领域精英的学术盛宴。 本次会议将深入探…...

深入了解diffusion model

diffusion model是如何运作的 会输入当时noise的严重程度&#xff0c;根据我们的输入来确定在第几个step&#xff0c;并做出不同的回应。 Denoise模组内部实际做的事情 产生一张图片和产生noise难度是不一样的&#xff0c;若denoise 模块产生一只带噪声的猫说明这个模块已经会…...

TransmittableThreadLocal原理

1、原理 TransmittableThreadLocal&#xff08;简称TTL&#xff09;是阿里巴巴开源的一个Java库&#xff0c;用于解决线程池中线程本地变量传递的问题。其底层原理主要是基于Java的ThreadLocal机制并对其进行扩展&#xff0c;以支持在父子线程间以及线程池中任务切换时&#x…...

华为昇腾310B初体验,OrangePi AIpro开发板使用测评

0、写在前面 很高兴收到官方的OrangePi AIpro开发板测试邀请&#xff0c;在过去的几年中&#xff0c;我在自己的博客写了一系列有关搭载嵌入式Linux系统的SBC&#xff08;单板计算机&#xff09;的博文&#xff0c;包括树莓派4系列、2K1000龙芯教育派、Radxa Rock5B、BeagleBo…...

GPTQ 量化大模型

GPTQ 量化大模型 GPTQ 算法 GPTQ 算法由 Frantar 等人 (2023) 提出&#xff0c;它从 OBQ 方法中汲取灵感&#xff0c;但进行了重大改进&#xff0c;可以将其扩展到&#xff08;非常&#xff09;大型的语言模型。 步骤 1&#xff1a;任意顺序量化 OBQ 方法选择权重按特定顺序…...