C++——入门基础(2)
文章目录
- 一、前言
- 二、C++入门
- 2.1 缺省参数
- 2.2 函数重载
- 2.2.1 参数类型不同
- 2.2.1.1 整体参数类型不同
- 2.2.1.2 参数类型顺序不同
- 2.2.2 参数个数不同
- 2.2.3 避坑注意
- 2.2.3.1无参与有参
- 2.2.3.2 返回值不同
- 2.3 引用
- 2.3.1 引用的概念
- 2.3.2引用的结构
- 2.3.3 引用的特点
- 2.3.4引用的作用
- 2.3.4.1 作用一
- 2.3.4.2 作用二
- 2.3.4.3 作用三
- 2.3.4.4 作用四
- 2.4 传值传参、传值返回、传引用返回的区别
- 2.4.1 传值传参
- 2.4.2 传值返回
- 2.4.3 传引用返回
- 2.4.4 传引用返回的误用
- 2.5 const引用
- 2.5.1 const引用的概念
- 2.5.2 const引用的用法
- 2.6 inline
- 2.7 nullptr
- 2.7.1 nullptr的概念
- 2.7.2 nullptr的用法
- 三、总结
一、前言
学前必问——今天的你还在继续学习吗?Hello啊,各位宝子们!上一节内容博主给大家细致的讲解了C++的入门语法以及与C的不同之处。我相信大家肯定已经完全消化了吧。那今天,博主和大家再续前言,深入理解C++的入门语法基础。
二、C++入门
2.1 缺省参数
1、缺省参数是函数在声明或者定义时为函数参数指定的一个缺省值,在我们调用函数的时候如果没有指定实参,那么默认采用形参的缺省值,否则使用指定的实参。缺省参数可以分为全缺省参数和半缺省参数。(有一些应用场景我们也把缺省参数称之为默认参数)
#include <iostream>
using namespace std;
int Add(int a = 1, int b = 2)
{return a + b;
}
int main()
{int ret1 = Add();//没有传递实参,使用默认的缺省值int ret2 = Add(2,3);//传递实参,使用指定的实参cout << ret1 << endl;cout << ret2 << endl;return 0;
}
2、全缺省就是全部形参都给缺省值,半缺省就是部分形参给缺省值。缺省值的指定使用是从右往左依次连续缺省,不可以跳跃或者间隔缺省。
#include <iostream>
using namespace std;
int sumAdd1(int a = 1, int b = 2, int c = 3)//全缺省
{return a + b + c;
}
int sumAdd2(int a , int b , int c = 3)//半缺省,缺省值从右往左依次缺省
{return a + b + c;
}
int main()
{int ret1 = sumAdd1();int ret2 = sumAdd2(10,20);//因为是半缺省,a和b用传递的参数,c用缺省值cout << ret1 << endl;cout << ret2 << endl;return 0;
}
3、当缺省参数进行函数调用是,语法规定缺省值必须从左往右依次传递给实参,不可以跳跃或者间隔传递。
#include <iostream>
using namespace std;
int sumAdd1(int a = 1, int b = 2, int c = 3)//全缺省
{return a + b + c;
}
int main()
{int ret1 = sumAdd1(10,20,30);//int ret2 = sumAdd1(10, , 30);//int ret3 = sumAdd1(, 20, 30);cout << ret1 << endl;//cout << ret2 << endl;//cout << ret3 << endl;return 0;
}
4、当函数的定义和声明分离的时候,语法规定缺省值必须包括在函数声明里面,不可以在定义和声明中同时包括缺省值。
//f.h
#pragma once
#include <iostream>
using namespace std;
int sumAdd1(int a = 1, int b = 2, int c = 3);
#include <iostream>
#include "f.h"
using namespace std;
int sumAdd1(int a, int b, int c)//全缺省
{return a + b + c;
}
int main()
{int ret1 = sumAdd1(10,20,30);cout << ret1 << endl;return 0;
}
//语法规定缺省值必须包括在函数声明里面
2.2 函数重载
C++语法支持在同一块作用域中出现同名的函数,但是这些函数的参数类型不同或者参数个数不同。通过函数重载使C++函数调用出现了多态行为,也让语法变得更加灵活。但值得注意的是:C语言中并不支持函数重载。
2.2.1 参数类型不同
2.2.1.1 整体参数类型不同
//整体参数类型不同
#include <iostream>
#include <iomanip>
using namespace std;
int Add(int num1, int num2)//int型
{return num1 + num2;
}
double Add(double num1, double num2)//double型
{return num1 + num2;
}
int main()
{int ret1 = Add(1, 2);double ret2 = Add(1.0, 2.0);cout << ret1 << endl;cout << fixed << setprecision(1) << ret2 << endl;return 0;
}
2.2.1.2 参数类型顺序不同
//参数类型顺序不同
#include <iostream>
using namespace std;
void f(int a, char b)//先int后char
{cout << "f(int a,char b)" << endl;
}
void f(char b,int a)//先char后int
{cout << "f(char b,int a)" << endl;
}
int main()
{f(1,'A');f('A',1);return 0;
}
2.2.2 参数个数不同
//参数个数不同
#include <iostream>
#include <iomanip>
using namespace std;
int Add(int num1, int num2)//参数个数为2
{return num1 + num2;
}
int Add(int num1, int num2, int num3)//参数个数为3
{return num1 + num2 + num3;
}
int main()
{int ret1 = Add(1,2);int ret3 = Add(1, 2, 3);cout << ret1 << endl;cout << ret3 << endl;return 0;
}
2.2.3 避坑注意
2.2.3.1无参与有参
这样两个函数进行重载会产生歧义并且报错,因为编译器不知道应该调用哪一个。
2.2.3.2 返回值不同
返回值不同不能作为函数重载的条件,因为编译器也不知道应该用谁。
2.3 引用
2.3.1 引用的概念
在C语言中,我们在学习指针的时候经常用到一个操作符&——取地址操作符。但是在C++语法中,它却又有了另外一种定义——引用。
引用不是定义一个新的变量,而是给已有的变量取一个别名,这个别名和它指向的变量共用同一块空间。编译器也不会因为引用而开辟新的空间。
说到这里你可能还是会有点懵逼,那我们就来举个例子吧。最近很火的一部动漫——不良人,相信大家都有一定的了解吧。里面的主角本名叫做李星云,他的手下称李星云为大帅,江湖又称之为天暗星。那么如果李星云一统天下,是不是大帅也一统天下了呢?那天暗星又有没有一统天下呢?其实本质上——李星云、大帅、天暗星所指代的都是同一个个体,只是具体叫法多样化了而已。
2.3.2引用的结构
#include <iostream>
using namespace std;
int main()
{int a = 0;int& b = a;//b是a的别名int& c = a;//c是a的别名int& d = a;//d是a的别名cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;cout << endl;d++;//因为a b c d所共用同一块空间,所以任意一个别名发生改变,原变量名和其他所有别名都会发生改变cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;return 0;
}
2.3.3 引用的特点
1、引用在定义时必须初始化;
2、对同一个变量可以进行多次引用;
3、一旦引用了一个实体,就不能引用其他实体。
2.3.4引用的作用
2.3.4.1 作用一
作函数形参,通过形参影响实参。
#include <iostream>
using namespace std;
void Swap(int& num1, int& num2)
{int tmp = num1;num1 = num2;num2 = tmp;
}
int main()
{int x = 1;int y = 2;cout << "交换前:" << x << " " << y << endl;Swap(x,y);cout << "交换后:" << x << " " << y << endl;return 0;
}
2.3.4.2 作用二
作函数形参,减少拷贝,提高效率
#include <iostream>
using namespace std;
int main()
{int x = 1;int y = 2;int* px = &x;int* py = &y;int*& rpx = px;int*& rpy = py;*rpx = 3;*rpy = 4;cout << x << endl;cout << y << endl;return 0;
}
2.3.4.3 作用三
做返回值类型,修改返回对象。
头文件:
主体代码文件:
测试文件:
可以看出代码可以正确运行,无报错。
//SeList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
typedef int SLDataType;
struct Sequelist
{SLDataType* arr;int size;int capacity;
};
typedef struct Sequelist SL;
void SLInit(SL& rs);
void SLPushBack(SL& rs, SLDataType x);
int& STTop(SL& rs);
//SeList.cpp
#include "SeList.h"
//void SLInit(SL* rs) 指针法
void SLInit(SL& rs)//初始化——引用法
{rs.arr = NULL;rs.size = 0;rs.capacity = 0;
}
//void SLCheckCapacity(SL* rs) 指针法
void SLCheckCapacity(SL& rs)//扩容——引用法
{if (rs.size == rs.capacity){SLDataType newcapacity = rs.capacity == 0 ? 4 : 2 * rs.capacity;SLDataType* tmp = (SLDataType*)realloc(rs.arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}rs.arr = tmp;rs.capacity = newcapacity;}
}
//void SLPushBack(SL& rs, SLDataType x) 指针法
void SLPushBack(SL& rs, SLDataType x)//尾插——引用法
{SLCheckCapacity(rs);rs.arr[rs.size++] = x;
}
//int STTop(SL* rs) 指针法
int& STTop(SL& rs)//首元素 ——引用法
{return rs.arr[0] ;
}
test.cpp
#include "SeList.h"
void test01()
{SL s1;SLInit(s1);SLPushBack(s1, 1);SLPushBack(s1, 2);SLPushBack(s1, 3);SLPushBack(s1, 4);int ret = STTop(s1);printf("%d\n", ret);
}
int main()
{test01();return 0;
}
2.3.4.4 作用四
做返回值类型,减少拷贝,提高效率。
//主体代码文件
//头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
typedef int SLDataType;
struct Sequelist
{SLDataType* arr;int size;int capacity;
};
typedef struct Sequelist SL;
void SLInit(SL& rs);
void SLPushBack(SL& rs, SLDataType x);
int& STTop1(SL& rs);
int& STTop(SL& rs);
#include "SeList.h"
//void SLInit(SL* rs) 指针法
void SLInit(SL& rs)//初始化——引用法
{rs.arr = NULL;rs.size = 0;rs.capacity = 0;
}
//void SLCheckCapacity(SL* rs) 指针法
void SLCheckCapacity(SL& rs)//扩容——引用法
{if (rs.size == rs.capacity){SLDataType newcapacity = rs.capacity == 0 ? 4 : 2 * rs.capacity;SLDataType* tmp = (SLDataType*)realloc(rs.arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}rs.arr = tmp;rs.capacity = newcapacity;}
}
//void SLPushBack(SL& rs, SLDataType x) 指针法
void SLPushBack(SL& rs, SLDataType x)//尾插——引用法
{SLCheckCapacity(rs);rs.arr[rs.size++] = x;
}
//int STTop(SL* rs) 指针法
int& STTop1(SL& rs)
{return rs.arr[0] ;
}
int STTop2(SL& rs)
{return rs.arr[0];
}
//测试文件
#include "SeList.h"
int test02()
{int a = 1;return a;
}
void test01()
{SL s1;SLInit(s1);SLPushBack(s1, 1);SLPushBack(s1, 2);SLPushBack(s1, 3);SLPushBack(s1, 4);int ret1 = STTop1(s1);printf("%d\n", ret1);int ret2 = STTop1(s1);printf("%d\n", ret2);
}
int main()
{test01();int ret3 = test02();printf("%d\n", ret3);return 0;
2.4 传值传参、传值返回、传引用返回的区别
在刚刚的引用介绍中,我们大体了解了传值传参、传值返回、传引用返回这三种传值方式。那么这三种方式具体又有什么区别呢?
2.4.1 传值传参
传值传参的过程:在函数被调用结束之后函数栈帧被销毁,需要返回的值实际上被拷贝存储在一个临时变量之中,最后由这个临时变量把返回值传递给接收值。
2.4.2 传值返回
传值返回的实质:在函数被调用结束之后函数栈帧被销毁,需要返回的值实际上被拷贝存储在一个临时变量之(但是注意:这个临时变量具有常性,是一个常变量,值不可修改)中,最后由这个临时变量把返回值传递给接收值。
2.4.3 传引用返回
传引用返回的实质:这里函数栈帧虽然被销毁但是传引用返回实际上返回的是返回值的别名,将这个别名直接返回给
了接收值,所以根本上就没有进行返回值的拷贝,也没有存储在临时变量之中这一说法。
注意:因为我们的顺序表是在堆区上申请的一块空间,所
以函数栈帧栈区的销毁并不影响堆区上存储的别名。
综上:由这三种传值方式的区别加以印证了引用做返回值类型,可以减少拷贝,提高效率。
2.4.4 传引用返回的误用
但是如果申请的空间就是在栈区上,那么你可就大错特错了。如下:
虽然此处编译通过但是存在非常大的潜在危险。
危险一:
危险二:
2.5 const引用
2.5.1 const引用的概念
1、可以引用一个cosnt对象,但是必须用const引用。const引用也可以作用于普通对象。
2、const引用中对象的访问权限可以缩小但是不能扩大。
3、在类型转换的时候会产生临时对象存储中间值,为了避免权限放大也要加上常引用。
2.5.2 const引用的用法
#include <iostream>
using namespace std;
int main()
{//可以作用于const对象const int a = 10;const int& ra = a;int b = 20;const int& rb = b;cout << ra << endl;cout << rb << endl;//也可以作用于普通对象int c = 30;const int& rc = c;cout << rc << endl;// const int d = 40;权限不能放大// int& rd = d;// cout << rd << endl;int d = 40;const int& rd = d;//权限可以缩小cout << rd << endl;double e = 3.14159;const int& f = e;//类型转换cout << f << endl;return 0;
}
2.6 inline
1、内联函数是C++中的一个特性,它允许程序员建议编译器在每个函数调用点直接插入函数的代码,而不是进行常规的函数调用。这是通过在函数声明前添加inline关键字来实现的。内联函数的主要目的是为了减少函数调用时的开销,特别是在函数体较小且被频繁调用的情况下。
2、当编译器处理内联函数时,它会尝试将函数的代码直接插入到每个调用点。这意味着函数的执行不需要跳转到另一个内存位置,也不需要进行常规的栈操作(如参数传递、返回地址保存等),从而节省了这些操作所需的时间。然而,内联仅仅是对编译器的一个建议,编译器可能会因为各种原因(如函数体过大或包含复杂的控制流语句)而决定不内联某个函数。
3、优点包括减少函数调用的开销,提高程序的运行效率,以及优化内存访问的局部性。然而,内联函数也有其缺点,如可能增加可执行程序的大小,导致物理内存不足,以及当内联函数定义改变时,需要重新编译整个程序。
4、内联函数适用于函数体较小(通常不超过10行)的函数,尤其是那些被频繁调用的函数。例如,一个简单的数学计算或访问器(getter/setter)函数可能是内联的良好候选。然而,不应该内联包含循环、switch语句或递归调用的函数,因为这可能导致代码膨胀,从而降低程序的效率。
2.7 nullptr
2.7.1 nullptr的概念
1、在C语言中我们经常会用到NULL,NULL实际上是一个宏。
2、在C++中NULL可能被定义为字面常量0,或者C中被定义为无类型(void*)的常量,但是不可否认对空值进行解引用时,会遇到一些不必要的麻烦。
3、C++语法规定nullptr是一个特殊的关键字,是一种特殊类型的字面量,可以转换成其他任意类型的指针类型。所以使用nullptr定义空指针就可以避免类型转换的问题,因为nullptr只能隐式地转换为指针类型,而不能转换为整数类型。
2.7.2 nullptr的用法
#include <iostream>
using namespace std;
void f(int x)
{cout << "f(int x)" << endl;
}
void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}
int main()
{f(0);f(NULL);//NULL的字面量为0f((int*)NULL);/*f((void*)NULL);*///因为函数重载中不能转换为所以参数类型,所以会报错f(nullptr);//只能隐式地转换为指针类型,而不能转换为整数类型return 0;
}
三、总结
好啦到目前为止,C++入门基础的所有语法就全部讲解完毕了。这就意味着我们已经两只脚都跨入了C++的门槛,以后的知识也会逐一递增。另外今天的知识分享确实有很大的难度,希望大家静下心来,好好沉淀,为以后成为一个C++大拿打下坚实的基础。
学习如磨刀,虽苦却利,持之以恒,必成大器。
相关文章:
C++——入门基础(2)
文章目录 一、前言二、C入门2.1 缺省参数2.2 函数重载2.2.1 参数类型不同2.2.1.1 整体参数类型不同2.2.1.2 参数类型顺序不同 2.2.2 参数个数不同2.2.3 避坑注意2.2.3.1无参与有参2.2.3.2 返回值不同 2.3 引用2.3.1 引用的概念2.3.2引用的结构2.3.3 引用的特点2.3.4引用的作用2…...
【MySQL】复合查询与内外连接
目录 一、复合查询 1、基本查询回顾: 2、多表查询: 3、自连接: 4、子查询: 单列子查询 多行子查询: 多列子查询: 在from语句中使用子查询: 5、合并查询: union࿱…...
第3篇:请求参数处理与数据校验
在 Web 开发中,请求参数处理与数据校验是保障系统稳定性的第一道防线。本文将深入探讨 Egg.js 框架中参数处理的完整解决方案,涵盖常规参数获取、高效校验方案、文件流处理等核心功能,并分享企业级项目中的最佳实践。 一、多场景参数获取策略…...
Android JIT编译:adb shell cmd package compile选项
Android JIT编译:adb shell cmd package compile选项 例如: adb shell cmd package compile -m speed -f --full 包名 配置参数指令说明: compile [-r COMPILATION_REASON] [-m COMPILER_FILTER] [-p PRIORITY] [-f] [--primary-dex] …...
排序算法——冒泡排序
一、介绍 「冒泡排序bubblesort」通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。 冒泡过程可以利用元素交换操作来模拟:从数组最左端开始向右遍历,依次比较相邻元素大小,如果“左…...
文献阅读篇#5:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(上)
期刊简介:《Advanced Engineering Informatics》创刊于2002年,由Elsevier Ltd出版商出版,出版周期Quarterly。该刊已被SCIE数据库收录,在中科院最新升级版分区表中,该刊分区信息为大类学科工程技术1区,2023…...
工行手机银行安全吗?在应用商店下载工商银行安全吗?
现在很多的人都会用手机银行,其中工行的使用几率也是比较高的,但大家在使用的过程中就会比较关心使用工行手机银行是否安全。如果直接在应用商店下载,是否有安全保障? 工行的手机银行会拥有较高的保障,从技术到服务都可…...
python如何word转pdf
在Python中,将Word文档(.docx或.doc)转换为PDF可以通过多种库实现。以下是几种常见的方法及详细步骤: 方法1:使用 python-docx comtypes(仅Windows,需安装Word) 适用于Windows系统…...
在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇实战指南
前言 RabbitMQ 是业界常用的开源消息中间件,支持 AMQP 协议,易于部署、高可用、插件丰富。本文以阿里云 ECS 上运行的 Ubuntu 24.04 LTS 为例,手把手带你完成 RabbitMQ 从仓库配置到运行的全流程,并分享在国内环境下常见的坑与对应解决方案。 环境概况 操作系统:Ubuntu …...
Linux Shell 重定向与管道符号(>, >>, |)的实现机制
文章目录 Linux Shell 重定向与管道符号(>, >>, |)的实现机制一、重定向基础:dup2() 的核心作用二、输出重定向的实现原理>(覆盖重定向)>>(追加重定向) 三、| 管道符的实现原…...
GitHub 趋势日报 (2025年04月30日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1686⭐ 54925Python2Qwe…...
计算机操作系统知识集合
主要来自小林coding 硬件结构 cpu位宽 如果用 32 位 CPU 去加和两个 64 位大小的数字,就需要把这 2 个 64 位的数字分成 2 个低位 32 位数字和 2 个高位 32 位数字来计算,先加个两个低位的 32 位数字,算出进位,然后加和两个高位…...
PostgreSQL数据类型
数据类型 数值类型 整数类型 SMALLINT 小范围整数,取值范围:-32768 ~ 32767 INT(INTEGER) 普通大小整数,取值范围:-2147483648 ~ 2147483647 浮点数类型 REAL 6位十进制数字精度 NUMERIC(m, n) 任意精度…...
在Linux中,KVM和Docker在Linux虚拟化中的区别是什么?
KVM(Kernel-based Virtual Machine)和Docker是Linux环境中两种不同的虚拟化技术,它们在实现原理、资源隔离程度、应用场景等方面存在显著区别: 实现原理与技术层级 KVM:KVM是一种基于硬件辅助虚拟化的全虚拟化技术&a…...
【docker学习笔记】如何删除镜像启动默认命令
一些镜像会在它打镜像时,加入一些默认的启动命令,可以通过docker inspect \<image id\>来查看Entrypoint。如下图,docker run启动时,会默认执行 "python3 -m vllm.entrypoints.openai.api_server" 如果不想执行&…...
c语言 39.0625转为16进制
c语言 39.0625转为16进制 寄存器的4~15对应整数部分 39为整数部分 39 (10进制) 0x27(16进制) 寄存器的0~3对应小数部分 0.0625为小数部分 0.0626 1/16 则0~3位十六进制值应为 0x1 39.06250…...
【阿里云大模型高级工程师ACP习题集】2.8 部署模型
习题集: 以下关于直接调用模型(无需部署)的说法,错误的是?【单选题】 A. 无需部署模型,只需简单调用API B. 按token量计费,无需担心模型部署的资源消耗 C. 可随意调用,没有任何限制 D. 适合业务初期或中小规模场景 使用vLLM部署模型时,若出现端口被占用的情况,以下做…...
【进阶】--函数栈帧的创建和销毁详解
目录 一.函数栈帧的概念 二.理解函数栈帧能让我们解决什么问题 三.相关寄存器和汇编指令知识点补充 四.函数栈帧的创建和销毁 4.1.调用堆栈 4.2.函数栈帧的创建 4.3 函数栈帧的销毁 一.函数栈帧的概念 --在C语言中,函数栈帧是指在函数调用过程中,…...
猫,为什么是猫?
英语单词 cat,意为猫: cat n.猫 根据首字母象形原则,通常我们喜欢将首字母C,解释为猫爪,C的形象,通常可解释为字母K的右侧的中间凹陷部分,K | <,也就是 C 和 < 相通&#…...
数字智慧方案6169丨智慧医院后勤管理解决方案(58页PPT)(文末有下载方式)
资料解读:智慧医院后勤管理解决方案 详细资料请看本解读文章的最后内容。 在当今万物互联的时代,传统医院后勤管理模式逐渐暴露出诸多弊端,已难以适应医院集团化发展的需求。这份智慧医院后勤管理解决方案资料,深入剖析了传统管理…...
经济学和奥地利学派的起源
(一)经济学和奥地利学派的起源: 早期思想: 亚当斯密被认为是现代经济学的鼻祖,但早期的亚里士多德、柏拉图以及中国的《管子》等著作也包含经济学思想,但更偏向财政学。 亚当斯密之前的学者: 坎…...
Linux安全清理删除目录bash脚本
直接写清除目录命令可能会因为一时手抖导致删除重要目录 rm -rf是个危险的命令,我写了bash脚本,放在环境变量目录下可以当系统命令来用 这里是单线程的,如果需要更高的性能,需要加入多线程的支持。 1.实现功能 清理目录的子内容…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…...
Lucene并不是只有倒排索引一种数据结构,支持多种数据结构
Lucene 的核心机制确实以**倒排索引(Inverted Index)**为核心,但它并不是“全部”都依赖倒排索引。Lucene 的索引结构中还包含其他辅助数据结构,用于支持不同的查询场景。以下是详细的解释: 1. 核心机制:倒…...
使用Docker一键安装SigLens:简单快捷的日志分析解决方案
在当今复杂的IT环境中,高效的日志管理和分析变得越来越重要。SigLens作为一款强大的开源日志分析工具,为开发者和运维人员提供了直观、高效的日志处理体验。本文将介绍如何使用Docker快速安装SigLens,让您在几分钟内就能开始进行日志分析。 为什么选择Docker安装SigLens? Do…...
【Linux】线程池和线程补充内容
个人主页~ 线程池 一、线程池简介单例模式线程池简介 二、单例模式线程池的实现1、ThreadPool.hpp2、Task.hpp3、main.cpp 三、其他常见锁读写锁 一、线程池简介 池化技术我们并不陌生,我们在前面的文章中实现过进程池,这里线程池的作用也是先申请资源交…...
vue3内置组件Suspense的使用
Suspense 实验性功能<Suspense> 是一项实验性功能。它不一定会最终成为稳定功能,并且在稳定之前相关 API 也可能会发生变化 <Suspense> 是一个内置组件,用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异…...
怪物猎人:世界-冰原10000+mod整合包5月最新更新!
700A大全套精美服装 800M大全套精美服装 3月31日更新 新增 新武器 新特效MOD 当前共计5800MOD整合包 好看的发型mod 实用的功能mod 炫酷的武器mod 新服装新特效新武器实用模组美化,等。 1月14日更新 新增皮肤MOD 500 当前共计2000MOD 1月16日更新 新增超…...
题解:洛谷 CF2091E Interesting Ratio
思路推导 我们先对 32 32 32 和 96 96 96 进行二进制拆分。 相同部分(用 α \alpha α 表示): 5 5 5 个 2 2 2。 不同部分(用 β \beta β 表示): 1 1 1 和 3 3 3。 gcd ( 32 , 96 ) \gcd(32,9…...
PETR和位置编码
PETR和位置编码 petr检测网络中有2种类型的位置编码。 正弦编码和petr论文提出的3D Position Embedding。transformer模块输入除了qkv,还有query_pos和key_pos。这里重点记录下query_pos和key_pos的生成 query pos的生成 先定义reference_points, shape为(n_query…...
《社交类应用开发:React Native与Flutter的抉择》
社交类应用以令人目不暇接的速度更新迭代。新功能不断涌现,从更智能的算法推荐到多样化的互动形式,从增强的隐私保护到跨平台的无缝体验,每一次更新都旨在满足用户日益增长且多变的需求。面对如此高频的更新需求,选择合适的跨端框…...
多模态大语言模型arxiv论文略读(五十三)
Red Teaming GPT-4V: Are GPT-4V Safe Against Uni/Multi-Modal Jailbreak Attacks? ➡️ 论文标题:Red Teaming GPT-4V: Are GPT-4V Safe Against Uni/Multi-Modal Jailbreak Attacks? ➡️ 论文作者:Shuo Chen, Zhen Han, Bailan He, Zifeng Ding, …...
POI从入门到上手(三)-轻松完成EasyExcel使用,完成Excel导入导出.
前言: Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 格式文件,提供丰富 API 来创建、读取和修改 Office 文档。 1.官网:Apache POI™ - the Java API for Microsoft Documents 2.优点:功能强大,可处…...
使用Delphi 和 CrossVcl 开发基于VCL的 macOS 和 Linux 应用程序简介
CrossVcl 快速入门 大家都知道delphi可以开发linux程序,更多的是知道FMXLinux开发基于FMX的程序,这里给大家介绍使用 Embarcadero Delphi 和 CrossVcl 开发基于VCL的 macOS 和 Linux 应用程序。 概述 CrossVcl 是一个工具链,允许使用 Emb…...
Android Kotlin 项目完整集成 Bugly 异常监控指南
Android Kotlin 项目集成 Bugly 异常监控完整指南 一、Bugly 简介 Bugly 是腾讯提供的专业移动应用异常监控平台,支持: 崩溃报告(Java/Native)错误分析性能监控热更新功能(需额外配置) 二、集成步骤 1…...
C++使用accumulate函数对数组进行快速求和
C使用accumulate函数对数组进行快速求和 一、普通数组 1.1方法: 1.先求出数组的长度: int size sizeof(arr) / sizeof(arr[0]); 2.使用指针作为迭代器调用accumulate函数:int sum std::accumulate(arr, arr size, 0); 3.注意带上头文…...
【音视频】RTMP流媒体服务器搭建、推流拉流
服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS) 推流端:ffmpeg OBS 拉流端:ffplay VLC srs播放器 1 安装和测试srs流媒体服务器 1.1 安装srs流媒体服务器 srs官⽹:https://github.com/ossrs/…...
React Router
为什么需要路由? 单页应用(SPA):在单页面中实现多视图切换,避免整页刷新。 核心功能: 根据 URL 路径渲染对应组件。 实现页面间导航(前进、后退、跳转)。 支持动态路由、嵌套路由…...
加载ko驱动模块:显示Arm版本问题解决!
1、问题 驱动模块加载,使用命令:modprobe chrdevbase.ko 时出现: hrdevbase: version magic 4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 ’ should be 4.1.15 SMP preempt mod_unload modversions ARMv7 p2v8 ’ ———————…...
OpenGL-ES 学习(9) ---- OpenGL-ES 简介和基本 Pipeline
目录 OpenGL-ES 简介渲染管线顶点和顶点着色器图元装配和光栅化片段和片段着色器逐片段操作EGL OpenGL-ES 简介 OpenGL-ES(OpenGL for Embedded System)是以手持和嵌入式设备为目标的高级3D图形应用编程接口,OpenGL ES 支持的的平台包括 IOS,Android&am…...
计算机视觉(CV)技术的优势和挑战(本片为InsCode)
计算机视觉(CV)技术是一种利用计算机和算法来模拟人类视觉实现图像和视频处理的技术。它在各个领域都有着广泛的应用,具有许多优势和挑战。 优势: 自动化:CV 技术可以自动识别、分类、跟踪和分析图像和视频数据&…...
Unity 几种主流的热更新方式
一、AssetBundle 资源热更 核心原理 将游戏资源打包为 AssetBundle 文件 运行时动态加载更新的 AssetBundle 实现步骤 资源标记:在 Unity Editor 中设置资源的 AssetBundle 属性 打包生成:使用 BuildPipeline.BuildAssetBundles 生成 AB 包 版本管…...
小结:ipsec-ike
IPSec 手动配置与自动配置(IKE动态协商) 手动配置IPSec 逻辑图 #mermaid-svg-eNMnNEwnoTjF8fkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eNMnNEwnoTjF8fkV .error-icon{fill:#552222;}…...
基于大模型预测的输尿管癌诊疗全流程研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测输尿管癌的原理与方法 2.1 大模型技术概述 2.2 用于输尿管癌预测的大模型选择 2.3 数据收集与处理 2.4 模型训练与优化 三、术前风险预测与手术方案制定 3.1 术前风险预测指标 3.2 大模型预测…...
Python Cookbook-6.14 实现状态设计模式
任务 你希望你程序中的某个对象能在不同的“状态”之间切换,而且该对象的行为方式也能随着状态的变化而变化。 解决方案 状态设计模式的关键思路是将“状态”(带有它自身的行为方式)对象化,使其成为一个类实例(带有一些方法)。在Python中,…...
2025智能体的发展趋势
以下是2025年智能体的一些主要发展趋势: 技术能力提升 多模态融合深化:智能体将能够更加自然地处理和理解多种模态的数据,如文本、图像、语音、视频等,实现跨模态的感知、理解和生成。这将使智能体在复杂场景下的应用更加广泛和…...
PCA主成分分析法(最大投影方差,最小重构距离,SVD角度)
统计分析中,数据的变量之间可能存在相关性,以致增加了分析的难度。于是,考虑由少数不相关的变量来代替相关的变量,用来表示数据,并且要求能够保留数据中的大部分信息。 在信号处理领域,信号具有较大方差,噪声具有较小…...
《数据结构初阶》【顺序表/链表 精选15道OJ练习】
《数据结构初阶》【顺序表/链表 精选15道OJ练习】 前言:---------------顺序表OJ练习---------------[26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)题目介绍方法一: [27. 移除元素](https://leetco…...
Python协程入门指北
一、什么是协程? 协程(Coroutine)就像可以暂停执行的函数,能够在执行过程中主动让出控制权,等准备好后再继续执行。 生活小例子 想象你在咖啡店排队: 普通函数:必须一直排到取餐(…...
Nginx 核心功能02
目录 一、引言 二、正向代理 (一)正向代理基础概念 (二)Nginx 正向代理安装配置 (三)正向代理配置与验证 三、反向代理 (一)反向代理原理与应用场景 (二…...