C++复试笔记(一)
Setw
是C++中用于设置输出字段宽度的函数。当使用 setw(3) 时,它会设置紧接着的输出字段的最小宽度为3个字符。如果字段内容长度小于3,则会在左侧填充空格以达到指定宽度;如果内容长度大于或等于3,则全部内容将被输出,不进行填充。
#include <iostream>
#include <iomanip>
using namespace std;int main() {
// 设置宽度为3,输出"1",左侧填充两个空格
cout << setw(3) << "1" << endl;
// 输出"1234",不进行填充,因为长度已经超过3
cout << "1234" << setw(3) << "1234" << endl;
return 0;
}
代码题
C++输入一个自然数,将该数反序输出
#include <stdio.h>
int main()
{int n,m;printf(“输入一个自然数:”);scanf("%d",&n);while(n>0){m=n%10;printf("%d ",m);n=n/10;}
}
读一行文件数字
#include <iostream>
#include<sstream>
#include<fstream>
using namespace std ;
void main(){ifstream in(" input.txt ");for(string s;getline(in, s);{int a, sum =0;for(istringstream sin(s);sin>>a;sum+=a);cout<<sum<<endl;}
}
具体来说,getline(in, s) 执行以下操作:
- 它尝试从由
in所引用的输入流中读取字符,并存储这些字符到字符串s中,直到遇到换行符(\n)为止。 - 读取结束后,换行符不会被存储到
s中,而是被丢弃。 - 如果在到达文件末尾之前没有遇到换行符,那么输入流将被设置为失效状态,表示已到达文件末尾或者发生了错误。
- 每次调用
getline()后,它会自动移除已经读取的那一行末尾的换行符,并将其后的内容留待下次读取。
for(string s; getline(in, s);) 这个循环会持续从 "input.txt" 文件中读取每一行文本到字符串 s 中,直到文件结束为止。对于每一行,程序都会计算该行中所有整数的和并输出结果。
istringstream sin(s);创建了一个名为sin的istringstream对象,并用字符串s初始化它。这意味着sin现在可以像输入流一样对待字符串s,允许您从中逐个提取值。- 之后的循环
for(istringstream sin(s); sin >> a;)利用了>>操作符从sin流中逐个提取整数并存储到变量a中。每次提取后,流的位置会自动向前移动,因此可以在下一次迭代时提取下一个数值。 - 在循环体内部,执行
sum += a;来累加这些从字符串中提取出来的整数值。
strncpy和strcpy的区别
strcpy 和 strncpy 都是 C 语言标准库中的字符串复制函数,它们都定义在 <string.h> 头文件中。尽管这两个函数的功能相似,但它们之间有一些重要的区别:
strcpy
- 功能:
strcpy函数用于将源字符串(包括终止空字符\0)复制到目标数组中。它不会检查目标数组的大小,这意味着如果源字符串长度超过了目标数组的容量,可能会导致缓冲区溢出。 - 原型:
char *strcpy(char *dest, const char *src); - 注意事项:使用
strcpy时需要特别小心,确保目标数组足够大以容纳源字符串的所有字符以及终止空字符。
strncpy
- 功能:
strncpy函数也用于复制字符串,但它接受一个额外的参数n,表示最多复制n个字符。如果源字符串的长度小于n,则会在目标字符串后面填充足够的空字符\0使其总长达到n。如果源字符串的长度大于或等于n,那么目标字符串将不会被自动以\0结尾。 - 原型:
char *strncpy(char *dest, const char *src, size_t n); - 注意事项:由于
strncpy不保证目标字符串以\0结尾,当源字符串长度大于或等于n时,您需要手动确保目标字符串以\0结尾,否则可能导致未定义行为。
主要区别总结
- 安全性:
strcpy不提供对目标数组越界的保护,容易导致安全问题;而strncpy提供了一定程度的安全性,通过限制最大复制字符数来避免溢出,但仍需注意手动添加终止符。 - 终止符:
strcpy保证目标字符串总是以\0结尾;而strncpy只有在复制的字符数少于n时才会添加\0,否则需要用户自己确保目标字符串以\0结束。 - 性能:
strncpy在某些情况下可能比strcpy慢,因为它需要额外的操作来填充剩余的空间为\0(当源字符串长度小于n时)。
选择使用哪一个函数应根据具体的需求和上下文环境来决定,考虑到安全性、性能以及是否需要手动处理字符串的终止符。在现代编程实践中,推荐使用更安全的替代方案,如使用 snprintf 或者 C++ 中的 std::string 类,以避免潜在的缓冲区溢出问题。
多重继承
#include<iostream>
using namespace std;class Base
{
public:int Bvalue;Base(int v) : Bvalue(v) {}
};// 使用虚继承
class D1 : virtual public Base
{
public:int Dvalue;D1(int v, int b) : Base(v), Dvalue(b) {}
};// 使用虚继承
class D2 : virtual public Base
{
public:int D2value;D2(int v, int c) : Base(v), D2value(c) {}
};// 修改构造函数以初始化虚基类
class D : public D1, public D2
{
public:int Dvalue;D(int a, int b, int c, int d) : Base(a), D1(a, b), D2(c, d), Dvalue(d) {}
};int main()
{D obj(1, 2, 3, 4);cout << obj.Bvalue << endl; // 现在可以正确访问 Bvaluereturn 0;
}
在这个修改版本中,D1 和 D2 都使用了虚继承(virtual public Base)来继承 Base 类。这保证了 Base 类只被实例化一次,从而解决了名称冲突和二义性问题。同时,在 D 类的构造函数中,需要直接调用 Base 的构造函数来初始化唯一的 Base 实例。这样,obj.Bvalue 就能正确访问 Base 类中的 Bvalue 成员了。代码模式
D1(int v, int b) : Base(v)这是什么意思?
D1(int v, int b) : Base(v) 这部分代码是 C++ 中的成员初始化列表(Member Initializer List)语法,用于在构造函数体内执行任何计算之前初始化基类或成员变量。让我们详细拆解一下这个表达式的含义:构造函数声明
D1(int v, int b):这是 D1 类的构造函数声明,它接受两个参数 v 和 b。
成员初始化列表
: Base(v):这是成员初始化列表的一部分,用于在进入构造函数体之前初始化基类 Base 或者对象的数据成员。在这个例子中,: Base(v) 表示使用传入的参数 v 来初始化基类 Base 的构造函数。
具体来说,当创建一个 D1 类的对象时,D1 的构造函数首先会通过调用基类 Base 的构造函数来初始化继承自 Base 的那部分数据成员(即 Bvalue)。这里假设 Base 类有一个接受单个整数参数的构造函数 Base(int v),它将这个值赋给 Base 类中的成员变量 Bvalue。完整解释
所以,完整的 D1 类构造函数 D1(int v, int b) : Base(v) 的含义是:接受两个参数 v 和 b。
使用 v 参数调用基类 Base 的构造函数,以初始化从 Base 继承来的成员变量(如 Bvalue)。
然后,在构造函数体 { Dvalue = b; } 内,使用 b 参数初始化 D1 自己的成员变量 Dvalue。
示例代码片段
cpp
深色版本
class Base
{
public:int Bvalue;Base(int v) : Bvalue(v) {} // 基类构造函数
};class D1 : public Base
{
public:int Dvalue;D1(int v, int b) : Base(v) // 调用基类构造函数初始化Bvalue{Dvalue = b; // 初始化D1自己的成员变量Dvalue}
};
在多重继承情况下,基类成员的名称冲突导致的。具体来说,在您的代码中,D 类从 D1 和 D2 继承,而这两个类又都从 Base 类继承。这意味着 D 类中有两个 Base 类的实例(即两个 Bvalue 成员),这会导致名称冲突。
在 C++ 中,当一个派生类通过多个路径继承同一个基类时,默认情况下该基类会在每个路径下被单独实例化,除非使用虚继承来避免重复实例化。因此,当你尝试访问 obj.Bvalue 时,编译器无法确定你指的是哪个 Bvalue,因为存在两个 Base 实例。
为了解决这个问题,可以使用虚继承(virtual inheritance),这样可以确保无论通过多少个路径继承,基类都只会被实例化一次。
D1 和 D2 都使用了虚继承(virtual public Base)来继承 Base 类。这保证了 Base 类只被实例化一次,从而解决了名称冲突和二义性问题。同时,在 D 类的构造函数中,需要直接调用 Base 的构造函数来初始化唯一的 Base 实例。这样,obj.Bvalue 就能正确访问 Base 类中的 Bvalue 成员了。
枚举
enum Color{ blue=1, yellow, green, white=8, black, red } favorite;
favorite 是一个类型为 Color 的变量。定义枚举类型的同时声明了一个该类型的变量是C++的一种语法特性,这意味着 favorite 是直接与 Color 枚举类型关联的一个实例。
具体来说,favorite 可以存储 Color 枚举中的任何一个值(即 blue, yellow, green, white, black, red),这些值分别对应整数值 1, 2, 3, 8, 9, 10。因此,您可以将 favorite 设置为这些枚举常量中的任意一个来表示不同的颜色选择。
例如:
- 如果你执行
favorite = blue;,那么favorite的值将是 1。 - 如果你执行
favorite = red;,那么favorite的值将是 10。
此外,由于 favorite 是一个 Color 类型的变量,你可以对它进行与枚举相关的操作,如赋值、比较等
字符指向导致内存泄漏
p->name = new char[10];
p->name = "Liumei";
这里发生了两步关键操作:
- 分配内存:
new char[10]为p->name分配了一个大小为10的字符数组,并让p->name指向这块新分配的内存。 - 重新赋值:紧接着,
p->name = "Liumei";将p->name直接指向了字符串字面值"Liumei"。这意味着p->name不再指向之前通过new分配的那块内存。
内存泄漏的原因
- 在第一步中,您分配了一块内存用于存储字符数据,并且这块内存的地址被保存在
p->name中。 - 然而,在第二步中,您将
p->name直接设置为指向一个常量字符串"Liumei"的地址。这导致p->name不再指向最初分配的那块内存区域。因此,最初分配的那块内存(即通过new char[10]分配的)失去了所有引用,无法再通过程序中的任何指针访问到它。这种情况下,这块内存就成为了“孤立”的,程序无法再释放它,从而造成了内存泄漏。
解决方案
为了避免这种情况,应该使用 strcpy 或类似的函数来复制字符串内容到已分配的内存空间中,而不是直接改变指针的指向。例如:
p->name = new char[10];
strcpy(p->name, "Liumei");
这样做之后,p->name 仍然指向通过 new char[10] 分配的内存,但该内存的内容已经被替换为 "Liumei" 字符串的内容。这样既不会丢失对分配内存的引用,也正确地初始化了 p->name 所指向的数据。当不再需要这块内存时,可以通过 delete[] p->name; 来安全地释放它,避免内存泄漏。
构造函数初始化
派生类构造函数的成员初始化列表中,不能包含(C)
A.基类的构造函数
B.派生类中成员对象的初始化
C.基类中成员对象的初始化
D.派生类中一般数据成员的初始化
class Base {Member obj;public:Base(int x) : obj(x) {}};
假设基类有一个成员对象,
然后派生类Derived继承自Base,如果Derived的构造函数想要初始化Base中的obj成员,是否可以直接在Derived的初始化列表中这样做?例如:
Derived::Derived(...) : Base(...), obj(...) { ... }
这样是否正确?显然是不正确的,因为obj是属于Base类的成员,只能在Base类的构造函数初始化列表中进行初始化。而派生类只能控制如何调用基类的构造函数,而不能直接初始化基类的成员对象。因此,选项C确实是不可行的,所以正确答案应该是选项C。
构造与析构(顺序)
#include <iostream>
using namespace std ;
class Myclass {int data;
public:Myclass(){cout << " constructor is called, " << endl; data - 0;}~Myclass(){cout << " destructor is called, " << endl;}
};
int main()
{Myclass obj[3];return 0;
}
由于 obj 是一个包含 3 个元素的数组,因此:
- 在声明
Myclass obj[3];时,构造函数会被调用 3 次(分别为数组中的每个元素创建一个对象),所以你会看到 "constructor is called," 输出 3 次。 - 当程序执行到
main函数的结尾,obj数组中的对象开始被销毁,析构函数也将被调用 3 次,"destructor is called," 将输出 3 次。 -
在C++中,当对象是一个数组的一部分时,析构函数的调用顺序与构造函数的调用顺序相反。具体来说:
- 构造函数按照对象在数组中的顺序从前往后依次调用(即,对于
Myclass obj[3];,首先是obj[0],然后是obj[1],最后是obj[2])。 - 析构函数则按照对象构造的相反顺序调用,也就是从数组的最后一个元素开始,向前逐一析构(即,先析构
obj[2],然后是obj[1],最后是obj[0])。
拷贝构造的传参问题
Myclass(Myclass x)
{data = x.data;cout << "copy constructor is called" << endl;
}
-
参数传递方式:在这个拷贝构造函数中,参数
Myclass x是通过值传递的。这意味着在调用拷贝构造函数时,实际上需要先创建一个临时对象来作为参数x传入,而创建这个临时对象本身又会调用拷贝构造函数,从而导致无限递归。
正确的:
Myclass(const Myclass& x)
{data = x.data;cout << "copy constructor is called" << endl;
}
多态性
#include <iostream>
using namespace std;
class CShape {
public:virtual float area(){return 0.0;}
};
class CTriangle : public CShape {
public:CTriangle(float h = 0, float w = 0) { H = h; W = w; }float area() { return 0.5 * H * W; }
private:float H, W;
};
class CCircle : public CShape {
public:CCircle(float r = 0) { R = r; }float area() { return 3.14 * R * R; }
private:float R;
};int main()
{CShape shape;cout << " shape.area()= " << shape.area() << endl;CTriangle tri(3, 4);cout << " tri.area()= " << tri.area() << endl;CCircle cir(5);cout << " cir.area()= " << cir.area() << endl;CShape* s1 = &tri;cout << " s1->area()= " << s1->area() << endl;CShape& s2 = cir;cout << " s2.area()= " << s2.area() << endl;return 0;
}

在C++中,当一个基类指针或引用指向或引用一个派生类对象,并且通过该指针或引用来调用一个虚函数时,会根据实际对象的类型来决定调用哪个版本的函数。这种机制被称为动态绑定或多态性。详细解释一下s1->area()和s2.area()的例子:
s1->area()
- 定义:
CShape* s1 = &tri; - 这里,
s1是一个指向基类CShape类型的指针,但它实际上指向的是派生类CTriangle的对象tri。 - 当通过
s1->area();调用area()函数时,由于area()在基类CShape中被声明为virtual(虚函数),程序会在运行时根据s1实际指向的对象类型(这里是CTriangle)来决定调用哪个版本的area()函数。 - 因此,尽管
s1是CShape类型的指针,它调用的是CTriangle类中的area()函数实现,输出为s1->area()= 6。
s2.area()
- 定义:
CShape& s2 = cir; - 在这里,
s2是基于基类CShape类型的引用,但实际引用的是派生类CCircle的对象cir。 - 类似地,当你调用
s2.area();时,因为area()是虚函数,程序会根据s2所引用的实际对象类型(这里是CCircle)来确定调用哪个area()函数的版本。 - 尽管
s2是作为CShape类型被引用的,但由于多态性的存在,真正执行的是CCircle类中的area()函数,因此输出为s2.area()= 78.5。
拷贝构造问题:
#include <iostream>
#include <cstring> // 使用<cstring>而非string.h
using namespace std;class Student {char* name;int age; float score;
public:Student(const char* n, int a, float s) : age(a), score(s) { // 改为const char*cout << " constructing..." << n << endl; name = new char[strlen(n) + 1];strcpy(name, n);}Student(const Student& s) { // 正确实现深拷贝cout << " copy constructing... " << s.name << endl; name = new char[strlen(s.name) + 1];strcpy(name, s.name);age = s.age;score = s.score; // 移除误导的析构输出}~Student() {cout << "destructing..." << name << endl;delete[] name; // 正确释放内存}
};int main() {Student s1("Liu", 18, 86.5), s2 = s1; // 正确调用构造函数和拷贝构造函数return 0;
}
当类中没有自定义拷贝构造函数时,C++编译器会生成默认的拷贝构造函数,这个默认拷贝构造函数会按成员进行浅拷贝(即逐字节复制内存)。
对于你的 Student 类:
-
name成员是一个动态分配的char*指针。 -
默认拷贝构造函数会将
s2.name直接指向s1.name的地址(即两者指向同一块内存)。 -
在析构的时候会造成对同一个地址进行二次析构,造成程序崩溃
链表的构造和异构
#include <iostream>
using namespace std ;struct Node {int data;Node* next;
};class LinkList {Node* head;
public:LinkList(int data[], int n){head = new Node;head->data = 0;head->next = nullptr;Node* tail = head; //尾指针for (int i = 0; i < n; i++){Node* ret = new Node;ret->data = data[i];ret->next = nullptr;tail->next = ret;tail = ret;}}LinkList(void){cout << "constructing an empty linked list." << endl;head = new Node;head->next = nullptr;}void Print(void){if (head->next == nullptr){cout << "empty" << endl;return;}Node* t = head->next;while (t != nullptr){cout << t->data << ",";t = t->next;}}~LinkList(){if (head== nullptr){delete head;}Node* t = head;while (t != nullptr){Node* ret = t;t = t->next;delete ret;}head == nullptr;}
};int main()
{int a[] = { 1,2,3,4,5 };int size = sizeof(a) / sizeof(a[0]);LinkList mylist(a, size);mylist.Print();cout << endl;LinkList mylist2;//制造空链表,不能用加(),mylist2();当然,可以选择不加,也可以选择加上{} :mylist2{}mylist2.Print();cout << endl;return 0;
}
相关文章:
C++复试笔记(一)
Setw 是C中用于设置输出字段宽度的函数。当使用 setw(3) 时,它会设置紧接着的输出字段的最小宽度为3个字符。如果字段内容长度小于3,则会在左侧填充空格以达到指定宽度;如果内容长度大于或等于3,则全部内容将被输出,…...
如何让一个类作为可调用对象被thread调用?
如何让一个类作为可调用对象,被 std::thread 调用 在 C 中,可以让一个类对象作为可调用对象(Callable Object),然后用 std::thread 进行调用。要实现这一点,主要有三种方法: 重载 operator()&…...
学习小程序开发--Day1
项目学习开篇 项目架构 项目进程 创建uni-app项目 通过HBuilderX创建 小结 page.json 和 tabBar 目录文件 pages.json的配置...
“量子心灵AI“的监控仪表盘 - javascript网页设计案例
【前端实战】基于Three.js和Chart.js打造未来科技风AI监控仪表盘 本文通过AI辅助开发,详细记录了一个高级前端项目的完整实现过程。文章包含核心代码片段、技术要点及遇到的问题与解决方案。适合有一定前端基础的开发者学习参考。 1. 项目概述 本文详细介绍了一个名…...
Redis 中 string 和 list 的原理说明
Redis 中 string 和 list 的底层实现 Redis有5种基础数据结构,对应的value分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合) Redis 对象头结构体: struct RedisObject {int4 type; // 4bits 对象的基本类型…...
JVM常用概念之String.intern()
问题 String.intern()的工作原理?我们应该如何使用它? 基础知识 字符串池(String Pool) String类在我们日常编程工作中是使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维…...
DeepLabv3+改进6:在主干网络中添加SegNext_Attention|助力涨点
🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…...
亚信安全发布2024威胁年报和2025威胁预测
在当今数字化时代,网络空间已成为全球经济、社会和国家安全的核心基础设施。随着信息技术的飞速发展,网络连接了全球数十亿用户,推动了数字经济的蓬勃发展,同时也带来了前所未有的安全挑战。2024年,网络安全形势愈发复…...
深入理解 DOM 元素
深入理解 DOM 元素:构建动态网页的基石 在网页开发的世界里,DOM(Document Object Model,文档对象模型)元素宛如一座桥梁,连接着静态的 HTML 结构与动态的 JavaScript 交互逻辑。它让原本呆板的网页变得鲜活…...
[数据分享第七弹]全球洪水相关数据集
洪水是一种常见的自然灾害,在全球范围内造成了极为严重的威胁。近年来,针对洪水事件的检测分析,以及对于洪水灾害和灾后恢复能力的研究日渐增多,也产生了众多洪水数据集。今天,我们一起来收集整理一下相关数据集。&…...
SpringBoot POST和GET请求
1. 什么是 HTTP 请求? HTTP 协议:超文本传输协议,用于客户端和服务器之间的通信。 常见 HTTP 方法: GET:获取资源POST:提交数据PUT:更新资源DELETE:删除资源 2. GET 请求详解 作…...
MySQL 面试篇
MySQL相关面试题 定位慢查询 **面试官:**MySQL中,如何定位慢查询? 我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看到…...
【Andrej Karpathy 神经网络从Zero到Hero】--2.语言模型的两种实现方式 (Bigram 和 神经网络)
目录 统计 Bigram 语言模型质量评价方法 神经网络语言模型 【系列笔记】 【Andrej Karpathy 神经网络从Zero到Hero】–1. 自动微分autograd实践要点 本文主要参考 大神Andrej Karpathy 大模型讲座 | 构建makemore 系列之一:讲解语言建模的明确入门,演示…...
Android MVC、MVP、MVVM三种架构的介绍和使用。
写在前面:现在随便出去面试Android APP相关的工作,面试官基本上都会提问APP架构相关的问题,用Java、kotlin写APP的话,其实就三种架构MVC、MVP、MVVM,MVC和MVP高度相似,区别不大,MVVM则不同&…...
python使用django搭建图书管理系统
大家好,你们喜欢的梦幻编织者回来了 随着计算机网络和信息技术的不断发展,人类信息交流的方式从根本上发生了改变,计算机技术、信息化技术在各个领域都得到了广泛的应用。图书馆的规模和数量都在迅速增长,馆内藏书也越来越多,管理…...
JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
JavaScript 事件系统是构建交互式 Web 应用的核心。本文从原生 DOM 事件到 React 的合成事件,内容涵盖: JavaScript 事件基础:事件类型、事件注册、事件对象事件传播机制:捕获、目标和冒泡阶段高级事件技术:事件委托、…...
大话机器学习三大门派:监督、无监督与强化学习
以武侠江湖为隐喻,系统阐述了机器学习的三大范式:监督学习(少林派)凭借标注数据精准建模,擅长图像分类等预测任务;无监督学习(逍遥派)通过数据自组织发现隐藏规律,…...
win11编译llama_cpp_python cuda128 RTX30/40/50版本
Geforce 50xx系显卡最低支持cuda128,llama_cpp_python官方源只有cpu版本,没有cuda版本,所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…...
FY-3D MWRI亮温绘制
1、FY-3D MWRI介绍 风云三号气象卫星(FY-3)是我国自行研制的第二代极轨气象卫星,其有效载荷覆 盖了紫外、可见光、红外、微波等频段,其目标是实现全球全天候、多光谱、三维定量 探测,为中期数值天气预报提供卫星观测数…...
Codeforces1929F Sasha and the Wedding Binary Search Tree
目录 tags中文题面输入格式输出格式样例输入样例输出说明 思路代码 tags 组合数 二叉搜索树 中文题面 定义一棵二叉搜索树满足,点有点权,左儿子的点权 ≤ \leq ≤ 根节点的点权,右儿子的点权 ≥ \geq ≥ 根节点的点权。 现在给定一棵 …...
HBuilder X 使用 TortoiseSVN 设置快捷键方法
HBuilder X 使用 TortoiseSVN 设置快捷键方法 单文件:(上锁,解锁,提交,更新) 安装好 TortoiseSVN ,或者 按图操作: 1,工具栏中 【自定义快捷键】 2,点击 默认的快捷键设置&…...
Java jar包后台运行方式详解
目录 一、打包成 jar 文件二、后台运行 jar 文件三、示例四、总结在 Java 开发中,我们经常需要将应用程序打包成可执行的 jar 文件,并在后台运行。这种方式对于部署长时间运行的任务或需要持续监听事件的应用程序非常重要。本文将详细介绍如何实现 Java jar 包的后台运行,并…...
Refreshtoken 前端 安全 前端安全方面
网络安全 前端不需要过硬的网络安全方面的知识,但是能够了解大多数的网络安全,并且可以进行简单的防御前两三个是需要的 介绍一下常见的安全问题,解决方式,和小的Demo,希望大家喜欢 网络安全汇总 XSSCSRF点击劫持SQL注入OS注入请求劫持DDOS 在我看来,前端可以了解并且防御前…...
Mysql5.7-yum安装和更改mysql数据存放路径-2020年记录
记录下官网里用yum rpm源安装mysql, 1 官网下载rpm https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html(附官网操作手册) wget https://repo.mysql.com//mysql80-community-release…...
[项目]基于FreeRTOS的STM32四轴飞行器: 七.遥控器按键
基于FreeRTOS的STM32四轴飞行器: 七.遥控器 一.遥控器按键摇杆功能说明二.摇杆和按键的配置三.按键扫描 一.遥控器按键摇杆功能说明 两个手柄四个ADC。 左侧手柄: 前后推为飞控油门,左右推为控制飞机偏航角。 右侧手柄: 控制飞机飞行方向&a…...
Android15使用FFmpeg解码并播放MP4视频完整示例
效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下...
numpy常用函数详解
在深度神经网络代码中经常用到numpy库的一些函数,很多看过之后很容易忘记,本文对经常使用的函数进行归纳总结。 np.arange arange是numpy一个常用的函数,该函数主要用于创建等差数列。它的使用方法如下所示: numpy.arange([star…...
安装树莓派3B+环境(嵌入式开发)
一、环境配置 1、下载树莓派镜像工具 点击进入下载连接 进入网站,点击下载即可。 2、配置wifi及ssh 将SD卡插入读卡器,再接入电脑,随后打开Raspberry Pi Imager下载工具, 选择Raspberry Pi 3 选择64位的操作系统 选择SD卡 选择…...
深度学习/强化学习调参技巧
深度调优策略 1. 学习率调整 技巧:学习率是最重要的超参数之一。过大可能导致训练不稳定,过小则收敛速度慢。可以使用学习率衰减(Learning Rate Decay)或自适应学习率方法(如Adam、RMSprop)来动态调整学习…...
p5.js:sound(音乐)可视化,动画显示音频高低变化
本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践,包括将音频振幅转化为图形、生成波形图。 承上一篇:vite:初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…...
