wordpress程序架构/扬州seo优化
🌇个人主页:平凡的小苏
📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。
🛸C++专栏:C++内功修炼基地
> 家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我真重要,各位路 过的友友麻烦多多点赞关注。 欢迎你们的私信提问,感谢你们的转发! 关注我,关注我,关注我,你们将会看到更多的优质内容!!
一、设计一个类,不能拷贝
1、c++98
class CopyBan
{
private:CopyBan(const CopyBan& cb);CopyBan& operator=(const CopyBan& cb);
};
int main()
{return 0;
}
1、将拷贝构造和赋值运算符重载设置为私有;
2、仅仅私有还不够,这并不能防止类内部就行拷贝。还要对拷贝构造和赋值运算符重载只声明却不实现。
2、C++11
class CopyBan
{CopyBan(const CopyBan& cb) = delete;CopyBan& operator=(const CopyBan& cb) = delete;
};
C++11直接使用delete禁用拷贝构造和赋值运算符重载。
二、请设计一个类只能在堆上创建对象
1、将构造设置为私有
-
将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。
-
提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建
-
外部通过CreateObj函数构造一个对象后,外部可以利用这个对象的指针拷贝构造一个栈区的对象,需要禁用拷贝构造。
class HeapOnly
{
public:static HeapOnly* CreateObject(){return new HeapOnly;}
private:HeapOnly() {}// C++98// 1.只声明,不实现。因为实现可能会很麻烦,而你本身不需要// 2.声明成私有HeapOnly(const HeapOnly&);// or// C++11 HeapOnly(const HeapOnly&) = delete;
};
2、将析构设置为私有
将析构函数设置为私有,栈区对象由于无法析构所以无法创建。堆区对象需要手动调用自己写的清理函数释放。
三、设计一个类只能在栈区设置对象
1、将构造函数私有;
2、提供一个静态的CreateObj方法用于构造栈区对象;
3、但是无法防止外部构造静态对象。
4、如果想彻底禁止生成静态的对象,需要再禁用拷贝构造。不过这样这个类只能生成临时对象或者引用的对象了,不能修改。
四、请设计一个类,不能被继承
1、C++98方式
// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class NonInherit
{public:static NonInherit GetInstance(){return NonInherit();}private:NonInherit(){}
};
2、C++11方式
final关键字,final修饰类,表示该类不能被继承。
class A final
{// ....
};
五、请设计一个类,只能创建一个对象(单例模式)
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
1、饿汉模式设计单例对象
class SingLeton
{
public:static SingLeton* getInstance(){return &m_instance;}
private://将构造函数私有SingLeton();//C++98方式防拷贝赋值SingLeton(const SingLeton& sl);SingLeton operator=(const SingLeton& sl);//C++11方式防拷贝赋值SingLeton(const SingLeton& sl) = delete;SingLeton operator=(const SingLeton& sl) = delete;static SingLeton m_instance;// 在程序入口之前就完成单例对象的初始化
};SingLeton SingLeton::m_instance;
饿汉模式:在main函数被加载之前就创建好对象。(全局和静态将在main函数之前被加载)
1、私有构造函数,禁用拷贝构造和赋值运算符重载;
2、在类中声明、外部定义一个静态的对象,用于调用类中私有的构造函数,同时作为单例对象被使用;
3、在类中提供一个获取静态对象的函数GetInstance,为了外部可调用,所以将该函数设置为静态。
饿汉模式的特点:
1、单例对象初始化时,数据太多会导致启动慢;
2、如果多个单例类有初始化的依赖关系,饿汉模式无法控制。例如A和B都是单例类,因为B的启动依赖A,所以需要先初始化A,再初始化B,但是饿汉模式无法控制对象的初始化顺序。
3、饿汉模式创建的对象绝对不会有线程安全问题,因为该模式的对象在main函数之前已经被创建好了,main函数之前线程都没启动呢
2、懒汉模式设计单例对象
如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好。
2.1、懒汉模式的设计以及线程安全问题
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <string>
#include <ctime>using namespace std;
class SingLeton
{
public:static SingLeton* getInstance(){//双检查加锁if (m_instance == nullptr){_mtx.lock();if (m_instance == nullptr){m_instance = new SingLeton();}_mtx.unlock();}return m_instance;}// 一般全局都要使用单例对象,所以单例对象一般不需要显示释放// 有些特殊场景,想显示释放一下static void DelInstance(){_mtx.lock();if (m_instance){delete m_instance;m_instance = nullptr;}_mtx.unlock();}void Add(const string& str){_mtx.lock();_v.push_back(str);_mtx.unlock();}void Print(){_mtx.lock();for (auto& e : _v){cout << e << endl;}cout << endl;_mtx.unlock();}// 单例对象回收class GC{public:~GC(){DelInstance();}};static GC _gc;
private://将构造函数私有SingLeton(){}//C++11方式防拷贝赋值SingLeton(const SingLeton& sl);SingLeton operator=(const SingLeton& sl);
private:static SingLeton* m_instance;// 在程序入口之前就完成单例对象的初始化static mutex _mtx;//静态锁,全局都能看到vector<string>_v;
};
//静态变量初始化
SingLeton* SingLeton::m_instance = nullptr;
mutex SingLeton::_mtx;
SingLeton::GC SingLeton::_gc;int main()
{srand(time(0));size_t n = 30;thread t1([n]() {for (size_t i = 0; i < n; ++i){SingLeton::getInstance()->Add("t1线程:" + to_string(rand()));}});thread t2([n]() {for (size_t i = 0; i < n; ++i){SingLeton::getInstance()->Add("t2线程:" + to_string(rand()));}});t1.join();t2.join();SingLeton::getInstance()->Print();return 0;
}
懒汉模式的特点:
1、对象在main函数之后才会创建;
2、可以主动控制对象的创建时机。
3、创建对象时存在线程安全问题,如果多个线程同时获取单例对象,会可能new多个对象,最后一个创建的对象指针会覆盖之前创建的对象指针,导致内存泄露。
2.2、懒汉模式需要加锁解决的线程安全问题
3、单例对象的释放问题
1、一般单例对象不需要考虑释放,资源会在进程结束时自动释放;
2、释放的写法如下:可以手动清理,将一些资源保存:可手动调用DelInstance进行资源的回收,main函数结束时,操作系统也会自动回收单例对象的资源。
4、比较简洁的懒汉模式
class SingLeton
{
public:static SingLeton* getInstance(){m_instance = new SingLeton();return m_instance;}
private://将构造函数私有SingLeton(){}//C++11方式防拷贝赋值SingLeton(const SingLeton& sl);SingLeton operator=(const SingLeton& sl);
private:static SingLeton* m_instance;// 在程序入口之前就完成单例对象的初始化vector<string>_v;
};
//静态变量初始化
SingLeton* SingLeton::m_instance = nullptr;
1、私有构造函数,禁用拷贝构造和赋值运算符重载;
2、通过getInstance返回静态对象(静态局部变量是在main函数之后才创建初始化)
这种方式构建的单例懒汉模式在C++11发布之前会有线程安全问题,多线程环境下可能会造成静态对象被初始化多次;而C++11规定静态局部变量是线程安全的,可以放心使用。
六、类型转换
1、C语言中的类型转换
C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。
-
隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
-
显式类型转化:需要用户自己处理
void Test ()
{int i = 1;// 隐式类型转换double d = i;printf("%d, %.2f\n" , i, d);int* p = &i;// 显示的强制类型转换int address = (int) p;printf("%x, %d\n" , p, address);
}
缺陷:
转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换
2、C++中的类型转换
C++尤其认为隐式类型转化有些情况下可能会出问题:比如数据精度丢失。
2.1、static_cast
int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;return 0;
}
static_cast适用于相似类型的转换。(可以隐式类型转换的都能用static_cast)
2.2、reinterpret_cast
int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;// 这里使用static_cast会报错,应该使用reinterpret_cast//int *p = static_cast<int*>(a);int* p = reinterpret_cast<int*>(a);return 0;
}
reinterpret_cast适用于不相关类型之间的转换。(不能隐式类型转换,只能强制类型转换的用reinterpret_cast)
2.3、const_cast
int main()
{const int a = 2;int* p = const_cast<int*>(&a);*p = 3;cout << a << endl;cout << *p << endl;return 0;
}
const_cast用于删除变量的const属性。需要关注内存可见性问题
编译器对const变量会有优化,认为const变量不会被改变,编译器在优化代码时可能会将变量放到寄存器或者其他高速缓存中。可以在a初始化时加上volatile关键字,加了volatile关键字后,对变量的读取和写入操作会从内存中进行,而不是从缓存中进行。
2.4、dynamic_cast
dynamic_cast用于将一个父类对象的指针 / 引用转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针 / 引用->父类指针 / 引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针 / 引用->子类指针 / 引用(用dynamic_cast转型是安全的)
注意:
1.dynamic_cast只能用于父类含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
3、RTTI
RTTI:Run-time Type identifification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:
1. typeid运算符
2. dynamic_cast运算符
3. decltype
七、IO流
1、C语言的输入输出
对输入输出缓冲区的理解:
1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
2、C++IO流
C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
IO流的特点
1.面向对象
2.更好支持自定义类对象的IO
3、流提取
流提取是一个阻塞操作,以空格或者换行作为一段读取的结束:
cin>>str是std::string的operator>>所支持的,它的返回值是istream。
为什么返回值istream可以作为while循环的逻辑判断呢?这是因为ios这个父类重载了operator bool,让其支持了逻辑判断。
从C++11开始,可以使用explicit关键字来显式声明operator bool()函数,完成istream到bool类型的转变,以避免隐式类型转换带来的问题。(这意味着其内部显式地将istream对象转换为bool类型的值,而不能进行隐式类型转换。可以避免编译器自作主张进行隐式类型转换,例如编译器将一个对象错误地转换为bool类型的值,而导致程序出现错误。)
那么问题来了,为什么void*和bool可以被重载?其实不是他俩能被重载,而是自定义类型可以通过类内重载指定类型完成隐式类型转换。(本质上是隐式类型转换,悄悄的改变类型,上面说了,你重载了类型之后,永远猜不到它会在哪个不该转换的地方发生转换)
4、C++文件IO流
C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件的一般步骤:
1. 定义一个文件流对象
ifstream(只输入用)
ofstream(只输出用)
fstream(又输出用)
2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
4. 关闭文件
4.1、二进制读写
struct ServerInfo
{char _address[32];//不要使用stringint _port;
};struct ConfigManager
{ConfigManager(const char* filename):_filename(filename){}void WriteBin(const ServerInfo& info){ofstream ofs(_filename, ofstream::out | ofstream::binary);ofs.write((char*)&info, sizeof(info));}void ReadBin(ServerInfo& info){ifstream ifs(_filename, ifstream::in | ifstream::binary);ifs.read((char*)&info, sizeof(info));}private:string _filename;
};
int main()
{ServerInfo winfo = { "192.0.0.1xxxxxxxxxxxxxxxxxxxxx", 80 };string str;cin >> str;if (str == "二进制写"){ConfigManager cm("test.txt");cm.WriteBin(winfo);}else if (str == "二进制读"){ServerInfo rinfo;ConfigManager cm("test.txt");cm.ReadBin(rinfo);cout << rinfo._address << endl;cout << rinfo._port << endl;}return 0;
}
二进制读写,不要对string对象进行读写操作。
4.2、文本读写(简单写法)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}operator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}
ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}
struct ServerInfo
{char _address[32];//不要使用stringint _port;Date _date;
};
struct ConfigManager
{ConfigManager(const char* filename):_filename(filename){}// 文本读写 C++文本读写更简单// 文本读写本质,内存中任何类型都是转成字符串在写// c语言文本读写很不方便,因为要不断转字符串// c++封装了以后就有很大的优势void WriteText(const ServerInfo& info){ofstream ofs(_filename, ofstream::out);ofs << info._address << " ";ofs << info._port << " ";ofs << info._date << endl;}void ReadText(ServerInfo& info){ifstream ifs(_filename, ifstream::in);ifs >> info._address;ifs >> info._port;ifs >> info._date;}
private:string _filename;
};
int main()
{ServerInfo winfo = { "192.0.0.1xxxxxxxxxxxxxxxxxxxxx", 80,{2023,11,5} };string str;cin >> str;if (str == "文本写"){ConfigManager cm("test.txt");cm.WriteText(winfo);}else if (str == "文本读"){ServerInfo rinfo;ConfigManager cm("test.txt");cm.ReadText(rinfo);cout << rinfo._address << endl;cout << rinfo._port << endl;cout << rinfo._date << endl;}return 0;
}
1、使用ofstream进行写入的时候,每一个变量写完必须给空格或换行,标定每个变量的读取结束,否则读取时会读取出错。
2、自定义类型也可以使用流插入和流提取的写法是因为ofstream和ifstream是ostream的子类,
子类对象可以调用继承于父类的流插入和流提取。(前提是自定义类型重载了流插入和流提取)
5、使用stringstream序列化和反序列化
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}operator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}
ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}
// 序列化和反序列化
struct ChatInfo
{string _name; // 名字int _id; // idDate _date; // 时间string _msg; // 聊天信息
};int main()
{ChatInfo winfo = { "张三", 135246, { 2022, 4, 10 }, "晚上一起看电影吧" };stringstream oss;oss << winfo._name << " ";oss << winfo._id << " ";oss << winfo._date << " ";oss << winfo._msg;string str = oss.str();cout << str << endl;stringstream iss(str);ChatInfo rinfo;iss >> rinfo._name;iss >> rinfo._id;iss >> rinfo._date;iss >> rinfo._msg;cout << "-------------------------------------------------------" << endl;cout << "姓名:" << rinfo._name << "(" << rinfo._id << ") ";cout << rinfo._date << endl;cout << rinfo._name << ":>" << rinfo._msg << endl;cout << "-------------------------------------------------------" << endl;return 0;
}
stringstream兼具ostringstream和istringstream
相关文章:

【C++】特殊类设计+类型转换+IO流
🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…...

JAVA整理学习实例(一)面向对象
JAVA整理学习实例(一)面向对象 注:整理一下之前写的东西,然后在修修补补,水平有限,有错误的请指正。 前言 基础部分的面试大部份是理论和一些语法细节,如果平时没有关注,在面试或者做…...

QT 实现解密m3u8文件
文章目录 概要如何解密M3U8文件呢实现思路和代码序列图网络请求解密 结论 概要 视频文件很多已M3U8文件格式来提供,先复习下什么是M3U8文件!用QT的 mutimedia框架来播放视频时,有的视频加载慢,有的视频加载快,为啥&am…...

论文阅读—— BiFormer(cvpr2023)
论文:https://arxiv.org/abs/2303.08810 github:GitHub - rayleizhu/BiFormer: [CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention" 一、介绍 1、要解决的问题:t…...

理解 fopen的 rwa r+w+a+ 参数含义
tags: C categories: C 理解 一图胜千言 我愿称之为最强 c - Difference between r and w in fopen() - Stack Overflow; 需要注意里面的a和 a, 区别在于 a 不可以读而 a可以读. c - Difference between r and w in fopen() - Stack Overflow; ModeReadWriteCreate New Fil…...

【强化学习】17 ——DDPG(Deep Deterministic Policy Gradient)
文章目录 前言DDPG特点 随机策略与确定性策略DDPG:深度确定性策略梯度伪代码代码实践 前言 之前的章节介绍了基于策略梯度的算法 REINFORCE、Actor-Critic 以及两个改进算法——TRPO 和 PPO。这类算法有一个共同的特点:它们都是在线策略算法,…...

驱动开发11-2 编写SPI驱动程序-点亮数码管
驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h>int m74hc595_probe(struct spi_device *spi) {printk("%s:%d\n",__FILE__,__LINE__);char buf[]{0XF,0X6D};spi_write(spi,buf,sizeof(buf));return 0; …...

Java使用pdfbox进行pdf和图片之间的转换
简介 pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图.引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>…...

机器学习中的关键组件
机器学习中的关键组件 数据 每个数据集由一个个样本组成,大多时候,它们遵循独立同分布。样本有时也叫作数据点或数据实例,通常每个样本由一组称为特征或协变量的属性组成。机器学习会根据这些属性进行预测,预测得到的称为标签或…...

【JVM】JDBC案例打破双亲委派机制
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JVM 打破双亲委派机制(JDBC案例…...

每天五分钟计算机视觉:池化层的反向传播
本文重点 卷积神经网络(Convolutional Neural Network,CNN)作为一种强大的深度学习模型,在计算机视觉任务中取得了巨大成功。其中,池化层(Pooling Layer)在卷积层之后起到了信息压缩和特征提取的作用。然而,池化层的反向传播一直以来都是一个相对复杂和深奥的问题。本…...

Docker的安装、基础命令与项目部署
文章目录 前言一、docker安装与MySQL部署1.Linux环境下docker的安装(1)基于CentOS7(2)基于Ubuntu 二、docker基础1.常见命令(1)快速创建一个mysql容器(MySQL得一键安装)。࿰…...

Nodejs和npm的使用方法和教程
Nodejs简介 Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具! ( 运行环境,是不是很熟悉,对。就是 java JRE,Java 运行时环境) Node.js 在浏览器之外运行 V8 Java…...

机器学习---支持向量机的初步理解
1. SVM的经典解释 改编自支持向量机解释得很好 |字节大小生物学 (bytesizebio.net) 话说,在遥远的从前,有一只贪玩爱搞破坏的妖怪阿布劫持了善良美丽的女主小美,智勇双全 的男主大壮挺身而出,大壮跟随阿布来到了妖怪的住处&…...

【unity实战】Unity实现2D人物双击疾跑
最终效果 前言 我们要实现的功能是双击疾跑,当玩家快速地按下同一个移动键两次时能进入跑步状态 我假设快速按下的定义为0.2秒内,按下同一按键两次 简单的分析一下需求,实现它的关键在于获得按键按下的时间,我们需要知道第一次…...

Spring面试题:(二)基于xml方式的Spring配置
xml配置Bean的常见属性 id属性 name属性 scope属性 lazy-init属性 init-method属性和destroy属性 initializingBean方法 Bean实例化方式 ApplicationContext底层调用BeanFactory创建Bean,BeanFactory可以利用反射机制调用构造方法实例化Bean,也可采用工…...

XR Interaction ToolKit
一、简介 XR Interaction Toolkit是unity官方的XR交互工具包。 官方XRI示例地址:https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples 2023.3.14官方博客,XRIT v2.3 https://blog.unity.com/engine-platform/whats-new-in-xr-int…...

spring-boot中实现分片上传文件
一、上传文件基本实现 1、前端效果图展示,这里使用element-ui plus来展示样式效果 2、基础代码如下 <template><div><el-uploadref"uploadRef"class"upload-demo":limit"1":on-change"handleExceed":auto-…...

【ICN综述】信息中心网络隐私安全
ICN基本原理: 信息中心网络也是需要实现在不可信环境下可靠的信息交换和身份认证 信息中心网络采用以数据内容为中心的传输方式代替现有IP 网络中以主机为中心的通信方式,淡化信息数据物理或逻辑位置的重要性,以内容标识为代表实现数据的查找…...

基于STC12C5A60S2系列1T 8051单片机EEPROM应用
基于STC12C5A60S2系列1T 8051单片机EEPROM应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC12C5A60S2系列1T 8051单片机EEPROM介绍基于STC12C5A60S2系列1T 8051单…...

手撕排序之直接选择排序
前言: 直接选择排序是排序中比较简单的排序,同时也是时间复杂度不是很优的排序。 思想: 本文主要讲解直接选择排序的优化版本。 我们经过一次遍历直接将该数列中最大的和最小的值挑选出来,如果是升序,就将最小的和…...

洛谷 P1359 租用游艇
题目链接 P1359 租用游艇 普及 题目描述 长江游艇俱乐部在长江上设置了 n n n 个游艇出租站 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 i i i 到游艇出租站…...

springboot中没有主清单属性解决办法
在执行一个 spring boot 启动类时,提示 没有主清单属性 一般这个问题是没加 spring-boot-maven-plugin 插件的问题,但是项目中已经加了 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifa…...

C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)
目录 一、前言 二、static关键字是什么? 三、static关键字修饰的对象是什么? 四、C 语言中的 static 🍎static的C用法 🍉static的重点概念 🍐static修饰局部变量 💦static在修饰局部变量和函数的作用 &a…...

windwos10搭建我的世界服务器,并通过内网穿透实现联机游戏Minecraft
文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …...

【实战Flask API项目指南】之七 用JWT进行用户认证与授权
实战Flask API项目指南之 用JWT进行用户认证与授权 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发…...

鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略
【⭐据说点赞收藏的都会收获好运哦👍】 一、鸿蒙Liteos读源码教程 鸿蒙的源码是放在openharmony文件夹下,openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。 内核是操作系统的核心部分,所以像负责:资源管理、任…...

axios的使用与封装详细教程
目录 一、axios使用方式二、axios在main.js配置 一、axios使用方式 在 Spring Boot Vue 的项目中使用 Axios,你需要在 Vue 项目中安装 Axios 库,因为 Axios 是一个前端 JavaScript 库,用于发送 HTTP 请求和处理响应数据,而与 Sp…...

C++二叉搜索树
本章主要是二叉树的进阶部分,学习搜索二叉树可以更好理解后面的map和set的特性。 1.二叉搜索树概念 二叉搜索树的递归定义为:非空左子树所有元素都小于根节点的值,非空右子树所有元素都大于根节点的值,而左右子树也是二叉搜索树…...

elasticsearch索引按日期拆分
1.索引拆分原因 如果单个索引数据量过大会导致搜索变慢,而且不方便清理历史数据。 例如日志数据每天量很大,而且需要定期清理以往日志数据。例如原索引为sc_all_system_log,现按天拆分索引sc_all_system_log20220902,sc_all_syste…...