【C++】基础3——正则表达式,静态多态(函数重载和模板),异常处理

文章目录

  • 1. 正则表达式
    • 1.1 regex_search
    • 1.2 regex_match
    • 1.3 regex_replace
    • 1.4 正则表达式补充
  • 2. 多态
  • 3. 重载
    • 3.1 普通函数重载
    • 3.2 运算符重载
      • 3.2.1 重载二元运算符
        • 重载 "<"
        • 重载"<<"和">>"
      • 3.2.2 重载一元运算法
        • 重载"!"
        • 重载"++"
          • 前置++
          • 后置++
  • 4. 模板
    • 4.1 函数模板
    • 4.2 类模板
    • 4.3 模板显式实例化
    • 4.4 模板特化
      • 4.4.1 全模板
      • 4.4.2 偏模板
  • 5. 异常处理
    • 5.1 捕获异常例子:vector的边界检查
    • 5.2 抛出异常+捕获异常例子:除法抛出除零异常,调用方捕获它
  • 6. 零散话题
    • 6.1 class和struc的异同
      • 6.1.1 相同点
      • 6.1.2 不同点
    • 6.2 什么是移动构造函数吗,拷贝构造函数

1. 正则表达式

1.1 regex_search

找字符串中匹配模式的子串。从字符串开始位置搜索,直到找到第一个匹配项(如果需要拿到所有匹配项,需要使用regex_iterator)就停止继续搜索并返回true,未能找到匹配项则返回false。

/*
regex_search(text, pat, matchResult)
text: string, 待匹配字符串
pat: regex, 正则表达式
matchResult(可选): smatch, 存放匹配结果。结果子串matchResult.str(),结果子串在原字符串中的位置matchResult.position()。
返回: bool 
*/#include <iostream>
#include <regex>
#include <string>void NonIterativeMtach(std::string text, std::regex pattern){std::smatch match;  // 用smatch保存匹配结果// 查找第一个匹配项: John Doe, 25 years oldif (std::regex_search(text, match, pattern)) {std::cout << "First match found:" << std::endl;std::cout << "Whole match: " << match.str(0) << std::endl;// 遍历各个捕获组for (size_t i = 1; i < match.size(); ++i) {std::cout << "Capture group " << i << ": " << match.str(i) << std::endl;}// 继续查找后续匹配项: Jane Smith, 30 years oldstd::string remainingText = match.suffix().str();while (std::regex_search(remainingText, match, pattern)) {std::cout << "\nNext match found:" << std::endl;std::cout << "Whole match: " << match.str(0) << std::endl;for (size_t i = 1; i < match.size(); ++i) {std::cout << "Capture group " << i << ": " << match.str(i) << std::endl;}remainingText = match.suffix().str();}} else {std::cout << "No match found." << std::endl;}
}// 使用迭代器遍历匹配结果
void IterativeMatch(std::string text, std::regex pattern){std::smatch match;std::sregex_iterator it(text.begin(), text.end(), pattern);  // 指向第一个匹配项的迭代器std::sregex_iterator end;  // 结束迭代器if(it == end){std::cout << "No match found." << std::endl;return;}for(; it!= end; it++){match = *it;std::cout << "Whole match: " << match.str(0) << std::endl;for (size_t i = 1; i < match.size(); ++i) {std::cout << "Capture group " << i << ": " << match.str(i) << std::endl;}std::cout << std::endl;}
}int main() {std::string text = "John Doe, 25 years old. Jane Smith, 30 years old.";std::regex pattern("(\\w+) (\\w+), (\\d+) years old");// 仅判断否匹配:std::regex_search(text, pattern)if(std::regex_search(text, pattern)){std::cout << "matched!" << std::endl;}NonIterativeMtach(text, pattern);std::cout << std::endl << std::endl;IterativeMatch(text, pattern);return 0;
}

1.2 regex_match

检查整个输入字符串是否完全匹配模式,如果匹配则返回true, 否则返 嘻嘻嘻尺寸小星星 false。

 /* 
regex_match(text, pat, matchResult): 
text: string, 待匹配字符串
pat: regex, 正则表达式
matchResult(可选): smatch, 存放匹配结果。结果子串matchResult.str(),结果子串在原字符串中的位置matchResult.position()。
返回: bool
*/#include <iostream>
#include <regex>int main(){std::string text1 = "John Doe, 25 years old";std::regex pattern("(\\w+) (\\w+), (\\d+) years old");std::smatch matches;if(std::regex_match(text1, matches, pattern)){std::cout << "text1 matched!" << std::endl;for(size_t i = 0; i < matches.size(); i++){std::cout << "matches[" << i << "]: " << matches[i] << std::endl;}}else{std::cout << "text1 not matched!" << std::endl;}// 整个输入字符串匹配才返回truestd::string text2 = "John Doe, 25 years old. Jane Smith, 30 years old.";if(std::regex_match(text1, pattern)){std::cout << "text2 matched!" << std::endl;}else{std::cout << "text2 not matched!" << std::endl;}
}

1.3 regex_replace

所有匹配项都被替换为subs后返回结果字符串。

/*
regex_replace(text, pat, subs)
text: string, 待匹配字符串
pat: regex, 正则表达式
subs: 替换字符串
flags(可选):控制匹配行为的匹配标志(大小写等)
返回: 匹配替换后的字符串
*/
#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "John Doe, 25 years old. Jane Smith, 30 years old."; // 简单替换std::regex pattern1(",");std::string replacement1 = " is";std::string result1 = std::regex_replace(text, pattern1, replacement1);// 使用捕获组替换std::regex pattern2("(\\w+) (\\w+), (\\d+) years old");std::string replacement2 = "$2 $1 is $3 years old";std::string result2 = std::regex_replace(text, pattern2, replacement2);std::cout << "Original text: " << text << std::endl;std::cout << "Replaced text1: " << result1 << std::endl;std::cout << "Replaced text2: " << result2 << std::endl;return 0;
}

1.4 正则表达式补充

  • 常用正则表达式元字符:

    • .:任意一个除换行符外的字符。
    • *:量词(贪婪),匹配0次或者多次。
    • +:量词(贪婪),匹配1次或多次。
    • ?:作量词时,匹配0次或1次;作非贪婪开关时,使贪婪量词转为非贪婪量词,如.*?.+?
  • 正则表达式的转义序列(C++): \\d 匹配数字,\\w 匹配单词,\\b 单词边界

  • 常用的正则表达式

    • 密码校验:^(?=.*[a-zA-Z])(?=.*\\d).+$
  • 零宽断言:正则表达式中,只判断不纳入匹配结果。

    • 正向先行断言:"apple(?=\\d+)"中括号内的表达式子是正向先行断言,表示匹配apple时,如果apple前是数字,则匹配成功,否则匹配失败。匹配结果是apple而不是apple加数字。
    • 正向后行断言:"(?<=¥)\\d+"括号内的表达式是正向后行断言,表示匹配数字时,如果数字前是符号,则匹配成功,否则匹配失败,匹配结果是数字而不是加数字。
    • 负向先行断言:"apple(?!\\d+)"如果apple后不是数字,匹配成功,否则匹配失败。
    • 负向后行断言:"(?<!¥)\\d+"如果数字前不是,匹配成功,否则匹配失败。
  • 性能考虑:编译正则表达式;减少使用非贪婪量词。

2. 多态

C++多态机制:静态多态(编译时多态)和动态多态(运行时多态)。

静态多态:函数重载;模板。ref:本文档第3章和第4章。

动态多态:虚函数和继承(运行时才确定对象的行为:派生类重写基类的虚函数f(),基类指针在运行时指向派生类对象,则将调用派生类对象的重写的f())。ref:https://blog.csdn.net/backlash321/article/details/146068181

3. 重载

函数签名:函数名,参数列表

函数头:返回类型,函数名,参数列表

函数声明:函数头

函数定义:函数头+函数体

重载的函数要求:函数名相同,函数参数列表不同,即函数签名相同。如果两个函数仅仅函数返回类型不同,那么这两个函数不构成重载(会报错)。

3.1 普通函数重载

int add(int a, int b) {return a + b;
}double add(double a, double b) {return a + b;
}

3.2 运算符重载

重载运算符要求:至少有一个参数是自定义类型;只能对已有运算符重载(+-*/) ,不能重载部分运算符( .::?:sizeof

3.2.1 重载二元运算符

重载 “<”
// 作为成员函数来重载二元运算符, String对象y、z,y < z解析为y.operator< (z)
class String{
public:bool operator<( const String & ) const;...
};// 作为非成员函数的二元重载运算符,y < z将被解析为operator(y, z)
bool operator<(const String &, const String & );
重载"<<“和”>>"
#ifndef PHONENUMBER_H
#define PHONENUMBER_H#include <iostream>
#include <string>// define
class PhoneNumber
{friend std::ostream &operator<<( std::ostream &, const PhoneNumber & );friend std::istream &operator>>( std::istream &, PhoneNumber & );
private:std::string areaCode;std::string exchange;std::string line;    
};
#endif

3.2.2 重载一元运算法

重载"!"
// 成员函数形式
class String{
public:bool operator!() const;...
};// 非成员函数形式
bool operator!( const String & );
重载"++"
前置++
// 成员函数形式, 编译器解析为d1.operator++()
class Date{
public:Date &operator++();...
}// 非成员函数形式,编译器解析为operator++( d1 )
Date &operator++( Date & );
后置++
// 成员函数形式,编译器解析为d1.operator++(0),参数0仅仅是为了编译器区分前置/后置
class {
public:Date opereator++( int );  // 需要占位参数...
}// 非成员函数形式,编译器解析为operator++( d1, 0 ),参数0仅仅是为了编译器区分前置/后置
Date operator++( Date &, int );

4. 模板

4.1 函数模板

// 单个类型模板
template <typename T>
void swap(T& a, T& b) {T temp = a;a = b;b = temp;
}// 多个类型模板
template <typename T1, typename T2>
void display(const T1& a, const T2& b) {cout << a << endl;cout << b << endl;
}

4.2 类模板

template <typename T>
class Stack {
private:T* data;int size;int capacity;public:Stack(int cap) : capacity(cap), size(0) {data = new T[capacity];}~Stack() {delete[] data;}void push(T value) {if (size < capacity) {data[size++] = value;}}T pop() {if (size > 0) {return data[--size];}return T();}
};

4.3 模板显式实例化

在代码中明确指定模板参数的具体类型,让编译器在特定位置生成该类型的模板实例,而不是等到模板被实际使用时才进行实例化。这样可以提升编译效率,避免连接错误。

#include <iostream>// 函数模板
template <typename T>
T add(T a, T b) {return a + b;
}// 类模板
template <typename T>
class Container {
public:Container(T value) : data(value) {}T getData() const {return data;}
private:T data;
};// 函数模板显式实例化
template int add<int>(int, int);
template float add<float>(float, float);// 类模板显式实例化
template class Container<double>;int main() {int result1 = add(1, 2);float ret = add(1.2, 1.3);std::cout << "Result of add(1, 2): " << result1 << std::endl;std::cout << "Result of add(1.2, 1.3): " << ret << std::endl;Container<double> c(3.14);std::cout << "Data in Container: " << c.getData() << std::endl;return 0;
}

4.4 模板特化

通用模板有一套实现逻辑,但是希望对某些具体的类型走其他逻辑而不是同一的通用模板逻辑。这时可以使用模板特化。可以理解为重写父模板。模板特化分为全特化(子模板将父模板的全部模板参数都指定成具体类型)和偏特化(子模板将父模板的部分模板参数指定为具体类型,其他模板参数扔指定为模板参数)

4.4.1 全模板

#include <iostream>// 函数模板
template <typename T1, typename T2>
T1 max(T2 a, T2 b) {return (a > b) ? a : b;
}// 函数模板全特化
template <>
bool max<bool, const char*>(const char* a, const char* b) {return (std::strcmp(a, b) > 0) ? a : b;
}int main() {int result1 = max<int, int>(1, 2);  // 调用时指定使用通用模板std::cout << "Max of 1 and 2: " << result1 << std::endl;bool result2 = max<bool, const char *>("ab", "bb");  // 调用时指定使用全特化模板std::cout << "Max of 'ab' and 'bb': " << result2 << std::endl;return 0;
}

4.4.2 偏模板

#include <iostream>// 类模板
template <typename T1, typename T2>
class Pair {
public:Pair(T1 first, T2 second) : first(first), second(second) {}void print() const {std::cout << "Generic Pair: " << first << ", " << second << std::endl;}
private:T1 first;T2 second;
};// 类模板偏特化
template <typename T>
class Pair<T, int> {
public:Pair(T first, int second) : first(first), second(second) {}void print() const {std::cout << "Partial Specialization Pair: " << first << ", " << second << std::endl;}
private:T first;int second;
};int main() {Pair<double, char> p1(3.14, 'A');  // 使用父模板p1.print();Pair<double, int> p2(3.14, 10);  // 使用特化的子模板p2.print();return 0;
}

5. 异常处理

  • 异常处理需要完成两件工作:抛出异常(throw),捕获异常(try-catch)。

  • 关于异常在调用栈中的传递:f1()调用f2(),f2()调用f3(),f3()抛出异常,选则在f1()还是f2()中捕获它?

    • 在f2()中处理异常的理由:如果 f2() 能够根据异常信息进行局部的错误恢复或处理,则不需要将异常向上传递(如f2() 可以尝试重新调用 f3() 或者使用备用方案来完成任务),这样可以保持较好的封装性。

    • 在f1()中处理异常的理由:如果f2()不足以处理异常,则应该向上传递给f1()。要求在一个较为宏观的层面全面而通用地处理异常和记录异常,则在f1()处理异常更合适(如记录日志、进行资源清理或者通知用户)。

5.1 捕获异常例子:vector的边界检查

#include < stdexcept >// vector对象的at函数提供边界检查和抛出异常的功能,at(ind)中ind超出vector现有元素范围,则抛出out_of_range异常(定义在<stdexcept>中)
try{cout << v.at( 8 ) << endl; 
}
catch (out_of_range &ex){cout << ex.what() <<endl;  // 显示存储在异常对象ex中存储的错误信息
}

5.2 抛出异常+捕获异常例子:除法抛出除零异常,调用方捕获它

#include <iostream>// 定义一个除法函数,可能会抛出除零异常
double divide(double a, double b) {if (b == 0) {// 抛出一个字符串类型的异常throw "Division by zero!";}return a / b;
}int main() {double num1 = 10.0;double num2 = 0.0;try {double result = divide(num1, num2);std::cout << "Result: " << result << std::endl;}catch (const char* error) {std::cerr << "Error: " << error << std::endl;}std::cout << "After exception" << std::endl;return 0;
}
/*
Error: Division by zero!
After exception
*/

6. 零散话题

6.1 class和struc的异同

6.1.1 相同点

都可以用来定义数据类型,内部可以定义数据成员和函数成员。

// struct的基本用法
struct MyStruct{  // 命名结构体int a;int b;void display(){cout << "display: ";cout << "a = " << a << ", b = " << b << endl;}MyStruct(int a, int b): a(a), b(b){}
};struct {  // 匿名结构体int a;int b;void display(){cout << "display: ";cout << "a = " << a << ", b = " << b << endl;}
} anonymousVar;  // 使用匿名结构体声明的变量// class的基本用法
class SqList{
public:SqList(int capacity=100){this->len = 0;this->capacity = 0;this->dataPtr = new int[capacity];if(this->dataPtr != NULL){this->capacity = capacity;// initfor(size_t i=0; i<capacity; i++){dataPtr[i] = 0;}}}~SqList(){len = 0;capacity = 0;delete[] dataPtr;}void traverse(){for(size_t i=0; i<len; i++){cout << dataPtr[i] << ' ';}cout << endl;}void display(){cout << "display: ";for(size_t i=0; i<capacity; i++){cout << dataPtr[i] << ' ';}cout << endl;}
private:int len;int capacity;int * dataPtr;
};int main() {SqList mySqList(10);MyStruct myStructInstance(1,2);mySqList.display();myStructInstance.display();
}

6.1.2 不同点

  • 默认成员变量权限不同,struct默认成员变量为public成员变量,class默认成员变量为private成员变量。
struct MyStruct{int a;int b;MyStruct(int a, int b): a(a), b(b){}
};class MyClass{int a;int b;MyClass(int a, int b): a(a), b(b){}
};int main(){MyStruct myStructInstance(1, 2);cout << "a = " << myStructInstance.a << ", b = " << myStructInstance.b << endl;// MyClass myClassInstance(1, 2);  // 出错,构造函数是private的// cout << "a = " << myClassInstance.a << ", b = " << myClassInstance.b << endl;  // 出错,成员变量是private的return 0;
}
  • 默认继承方式不同,struct默认public继承,class默认praivate继承
struct BaseStruct{int a;BaseStruct(int a):a(a){}
};struct DerivedStruct: BaseStruct{int b;DerivedStruct(int a, int b):BaseStruct(a), b(b){}
};class BaseClass{int a;BaseClass(int a): a(a){}
};class DerivedClass: BaseClass{int b;// DerivedClass(int a, int b): BaseClass(a), b(b){}  // 基类构造函数为private,派生类无法访问
};int main(){DerivedStruct myDerivedStructInstance(1, 2);cout << "a = " << myDerivedStructInstance.a << ", b = " << myDerivedStructInstance.b << endl;// MyClass myClassInstance(1, 2);  // 出错,构造函数是private的// cout << "a = " << myClassInstance.a << ", b = " << myClassInstance.b << endl;  // 出错,成员变量是private的return 0;
}

6.2 什么是移动构造函数吗,拷贝构造函数

拷贝构造函数:创建对象的副本时使用。拷贝构造函数被调用的时机:用一个对象初始化另一个同类型对象时;函数传参时;函数返回时;以某类型对象为元素的容器在插入对象时,会调用该类型的拷贝构造函数。

移动构造函数:定义移构造函数,函数返回值时不再需要拷贝临时对象(右值)控制的资源,而只需要将临时对象(右值)的资源控制权交给新对象即可。返回值对象就是临时对象(右值)。

class MyClass{
public:// 自定义构造函数MyClass(int cap){this->len = 0;this->cap = cap;this->data = new(std::nothrow) int[cap];  // 分配内存失败不会返回bad_alloc,而是返回nullptrif(this->data != nullptr){for(size_t i=0; i < cap; i++){this->data[i] = 0;}}}// 拷贝构造函数MyClass(MyClass &other){cout << "Copy Constructor is called!" << endl;len = other.len;cap = other.cap;// 深拷贝data = new(std::nothrow) int[other.cap];if(data != nullptr){for(size_t i=0; i < cap; i++){data[i] = other.data[i];}}}// 移动构造函数MyClass(MyClass &&other){cout << "Move Constructor is called!" << endl;len = other.len;cap = other.cap;// 浅拷贝data = other.data;other.data = nullptr;  // 避免右值对象被销毁时释放data}// 析构函数~MyClass(){delete[] data;}void display(){for(size_t i=0; i<cap; i++){cout << data[i] << ' ';}cout << endl;}
private:int len;int cap;int *data;
};MyClass f(MyClass a){  // 发生拷贝cout << "just enter f()" << endl;cout << "before return f()" << endl;return a;
}int main(){MyClass myClassIns(10);myClassIns.display();MyClass b = f(myClassIns);  // 传参调用拷贝构造函数;返回调用移动构造函数(返回值是临时对象,作为右值,将资源控制权交给左值b对象,导致调用移动构造函数)return 0;
}/*
0 0 0 0 0 0 0 0 0 0 
Copy Constructor is called!
just enter f()
before return f()
Move Constructor is called!
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43188.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

罗杰斯特回归

定义 逻辑回归其实就是原来的线性回归加了激活函数&#xff0c;这个函数其实就是sigmoid函数&#xff0c;把一个回归的连续数值压缩到了0到1的空间&#xff0c;其实只要有函数能够满足把数值压缩到0,1之间就可以&#xff08;因为0到1之间的数值就是概率值&#xff09; 对于分类…

Elasticsearch 高级

Elasticsearch 高级 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索Elasticsearch 搜索高级Elasticsearch高级&#xff08;本文&#xff09; 1. nested 类型 1.1 介绍 Elasticsearch 中的 nested 类型允许你在文档内存储复杂的数据结构&#xff0c;比如一个…

基于SpringBoot实现的高校实验室管理平台功能四

一、前言介绍&#xff1a; 1.1 项目摘要 随着信息技术的飞速发展&#xff0c;高校实验室的管理逐渐趋向于信息化、智能化。传统的实验室管理方式存在效率低下、资源浪费等问题&#xff0c;因此&#xff0c;利用现代技术手段对实验室进行高效管理显得尤为重要。 高校实验室作为…

leetcode_704. 二分查找_java

704. 二分查找https://leetcode.cn/problems/binary-search/ 1.题目 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示…

python基础学习三(元组及字符串的使用)

文章目录 元组什么是元组元组的创建方式为什么要将元组设计成不可变序列元组的遍历集合集合的相关操作集合操作集合的数学操作集合生成式列表&#xff0c;字典&#xff0c;元组&#xff0c;集合总结 字符串字符串的驻留机制判断字符串的操作方法字符串的比较操作字符串的切片操…

游戏被外挂攻破?金融数据遭篡改?AI反作弊系统实战方案(代码+详细步骤)

一、背景与需求分析 随着游戏行业与金融领域的数字化进程加速,作弊行为(如游戏外挂、金融数据篡改)日益复杂化。传统基于规则的防御手段已难以应对新型攻击,而AI技术通过动态行为分析、异常检测等能力,为安全领域提供了革命性解决方案。本文以游戏反作弊系统和金融数据安…

深入理解 TypeScript 中的类型断言(Type Assertion)

类型断言是 TypeScript 中一个强大而独特的特性&#xff0c;它允许开发者告诉编译器&#xff1a;"我知道这个值的类型是什么&#xff0c;请相信我"。本文将全面探讨类型断言的概念、语法、使用场景、最佳实践以及潜在陷阱&#xff0c;帮助你在 TypeScript 开发中更有…

matplotlib标题比x,y轴字体大,明明标题字体更大?

原始代码&#xff1a; plt.xlabel(训练轮次&#xff08;Epochs&#xff09;, fontsize14, fontweightbold, fontpropertieschinese_font) # 设置中文字体、加大、加粗 plt.ylabel(R值, fontsize14, fontweightbold, fontpropertieschinese_font) # 设置中文字体、加大、加粗…

MySQL DQL,数据查询语言的用法

语法&#xff1a;select 字段名 from 表名 [where <条件>]选择符合条件的记录 group by 字段名表 :分组 having <条件> :选择符合条件的组 order by 字段名表 …

Python练习之抽奖界面

前言 一、代码整体架构分析 1、数据层 (Model) 2、控制层 (Controller) 3、视图层 (View) 二、核心功能实现详解 1、 文件导入功能 1.1、实现逻辑 1.2、代码涉及知识点讲解 1.2.1、wildcard 1.2.2、wx.FileDialog 1.2.3、dlg.ShowModal() 2、抽奖动画控制 1.1、…

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档&#xff08;带图片&#xff09;预览&#xff0c;并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档&#xff08;带图片&#xff09;&#xff0c;预览、导出安装插件docx 模板文件内容完整代码…

springmvc redirect 使用https后跳转到了http://域名:443问题处理

最近在处理一个很久之前的项目的时候&#xff0c;由于需要将http升级到https&#xff0c;导致springmvc项目中配置的redirect报错 线上的返回结果是http://abc.test.com:443/jrbac/mobile/wechat.html 通过nginx配置了一下解决了&#xff0c;记录一下 location /jrbac {proxy…

用空闲时间做了一个小程序-二维码生成器

一直在摸鱼中赚钱的大家好呀~ 先向各位鱼友们汇报一下情况&#xff0c;目前小程序已经有900的鱼友注册使用过。虽然每天都有新的鱼友注册&#xff0c;但是鱼友增长的还很缓慢。自从国庆前的文字转语音的工具上线到现在已经将近有1个月没有更新小程序了。但是今天终终终终终于又…

【JavaEE】springMVC返回Http响应

目录 一、返回页面二、Controller和ResponseBody与RestController区别三、返回HTML代码⽚段四、返回JSON五、HttpServletResponse设置状态码六、设置Header6.1 HttpServletResponse设置6.2 RequestMapping设置 一、返回页面 步骤如下&#xff1a; 我们先要在static目录下创建…

【新手初学】SQL注入getshell

一、引入 木马介绍&#xff1a; 木马其实就是一段程序&#xff0c;这个程序运行到目标主机上时&#xff0c;主要可以对目标进行远程控制、盗取信息等功能&#xff0c;一般不会破坏目标主机&#xff0c;当然&#xff0c;这也看黑客是否想要搞破坏。 木马类型&#xff1a; 按照功…

验证Linux多进程时间片切换的程序

​​ 一、软件需求 在同时运行多个CPU密集型进程时&#xff0c;需采集以下统计信息&#xff1a; 当前运行在逻辑CPU上的进程ID每个进程的运行进度百分比 实验程序设计要求&#xff1a; 1. 命令行参数 参数说明示例值n并发进程数量3total总运行时长&#xff08;毫秒&…

Spring笔记03-依赖注入

简述: Spring 依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是 Spring 框架的核心功能之一&#xff0c;它通过将对象的依赖关系交由 Spring 容器来管理&#xff0c;实现了对象之间的解耦&#xff0c;提高了代码的可维护性和可测试性。 构造器注入示例:…

减少采样空间方法 变成后验概率

又 因为后验概率很难计算 --所以通过引入变分分布来近似 后验概率分布 同时 引入 kl散度来度量 近似的效果好不好 什么是kl散度 kl散度带变分&#xff1a; 第一个问题 &#xff1a;积分变期望 问题二&#xff1a;贝叶斯公式 第三个问题&#xff1a;为啥可以独立出来 因为相比…

【keil】单步调试

一、步骤 1、打开stc-isp软件 2.打开keil仿真设置&#xff0c;选择对应的单片机型号 3.点击将所选目标单片机设置为仿真芯片&#xff0c;点击下载&#xff0c;按一下单片机打下载按钮 4.此时已经将仿真程序下载到单片机 5.此时点击options,找到debug选择STC Montor 51 Driv…

【即插即用涨点模块-卷积】SPDConv空间深度卷积,助力小目标与低分辨有效涨点【附源码+注释】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…