C++复习笔记--STL的string容器和vector容器
1--string容器
string 本质上是一个类,其不同于指针 char*,string 类的内部封装了 char*,用于管理字符串,是一个 char* 型的容器;
1-1--string构造函数
string 的构造函数原型:
string(); // 创建一个空的字符串
string(const char* s); // 使用字符串 s 进行初始化
string(const string& str); // 使用一个 string 对象初始化另一个 string 对象;
string(int n, char c); // 使用 n 个字符 c 进行初始化;
代码实例:
#include <iostream>
#include <string>
int main(int argc, char* argv[]){// string(); // 创建一个空的字符串std::string s1;// string(const char* s); // 使用字符串 s 进行初始化const char* str = "hello world";std::string s2(str);// string(const string& str); // 使用一个 string 对象初始化另一个 string 对象;std::string s3(s2);// string(int n, char c); // 使用 n 个字符 c 进行初始化;std::string s4(10, 'a');std::cout << "s1: " << s1 << std::endl;std::cout << "s2: " << s2 << std::endl;std::cout << "s3: " << s3 << std::endl;std::cout << "s4: " << s4 << std::endl;return 0;
}1-2--string赋值操作
string 赋值操作的函数原型:
string& operator=(const char* s); // 将 char* 类型的字符串赋值给当前字符串
string& operator=(const string &s); // 将字符串 s 赋给当前的字符串
string& operator=(char c); // 将字符 c 赋给当前的字符串
string& assign(const char *s); // 将字符串 s 赋给当前字符串
string& assign(const char *s, int n); // 将字符串 s 的前 n 个字符赋给当前的字符串
string& assign(const string &s); // 将字符串 s 赋给当前字符串
string& assign(int n, char c); // 将 n 个字符 c 赋给当前字符串
代码实例:
#include <iostream>
#include <string>
int main(int argc, char* argv[]){// string& operator=(const char* s); // 将 char* 类型的字符串赋值给当前字符串std::string str1;str1 = "hello world";std::cout << "str1 = " << str1 << std::endl;// string& operator=(const string &s); // 将字符串 s 赋给当前的字符串std::string str2;str2 = str1;std::cout << "str2 = " << str2 << std::endl;// string& operator=(char c); // 将字符 c 赋给当前的字符串std::string str3;str3 = 'a';std::cout << "str3 = " << str3 << std::endl;// string& assign(const char *s); // 将字符串 s 赋给当前字符串std::string str4;str4.assign("hello C++");std::cout << "str4 = " << str4 << std::endl;// string& assign(const char *s, int n); // 将字符串 s 的前 n 个字符赋给当前的字符串std::string str5;str5.assign("hello C++", 5);std::cout << "str5 = " << str5 << std::endl;// string& assign(const string &s); // 将字符串 s 赋给当前字符串std::string str6;str6.assign(str5);std::cout << "str6 = " << str6 << std::endl;// string& assign(int n, char c); // 将 n 个字符 c 赋给当前字符串std::string str7;str7.assign(10, 'w');std::cout << "str7 = " << str7 << std::endl;return 0;
}
1-3--string字符串拼接
string 实现在字符串末尾拼接字符串,其函数原型如下:
string& operator+=(const char* str); // 重载+=操作符来拼接
string& operator+=(const char c); // 重载+=操作符来拼接
string& operator+=(const string& str); // 重载+=操作符来拼接
string& append(const char *s); // 把字符串 s 拼接到当前字符串末尾
string& append(const char *s, int n); // 把字符串 s 的前 n 个字符拼接到当前字符串末尾
string& append(const string &s); // 把字符串 s 拼接到当前字符串末尾
string& append(const string &s, int pos, int n); // 把字符串 s 从 pos 位置开始截取 n 个字符,拼接到当前字符串末尾
#include <iostream>
#include <string>
int main(int argc, char* argv[]){std::string str1 = "I";str1 += " Love sleeping";std::cout << "str1: " << str1 << std::endl;std::string str2 = " and eating.";str1 += str2;std::cout << "str1: " << str1 << std::endl;std::string str3 = "I";str3.append(" Love");std::cout << "str3: " << str3 << std::endl;str3.append(" game abcd", 5); // 前 n 个字符std::cout << "str3: " << str3 << std::endl;str3.append(str2, 0, 4); // 截取字符串规定位置作为拼接; 第2个参数表示截取的起始位置,第3个参数表示截取字符的个数std::cout << "str3: " << str3 << std::endl;return 0;
}
1-4--string查找与替换
查找:查找指定字符串是否存在;
替换:在指定的位置替换字符串;
函数原型:
int find(const string& str, int pos = 0) const; // 查找str第一次出现的位置,从pos开始查找;
int find(const char* s, int pos = 0) const; // 查找s第一次出现的位置,从pos开始查找;
int find(const char* s, int pos, int n) const; // 从 pos 位置查找s的前n个字符;
int find(const char c, int pos = 0) const; // 查找字符c第一次出现的位置;
int rfind(const string& str, int pos = npos) const; // 查找str第一次出现的位置,从pos开始查找;(从右往左)
int rfind(const char* s, int pos = npos) const; // 查找s出现的位置,从pos开始查找;(从右往左)
int rfind(const char* s, int pos, int n) const; // 从 pos 位置查找s的前n个字符;(从右往左)
int rfind(const char c, int pos = 0) const; // 查找字符c出现的位置;(从右往左)
string& replace(int pos, int n, const string& str); // 替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s); // 替换从pos开始n个字符为字符串s
代码实例:
#include <iostream>
#include <string>
int main(int argc, char* argv[]){std::string str1 = "abcdabcd";// 从左往右查找int pos = str1.find("cd");if (pos == -1){std::cout << "The dst string is not exist";}else{std::cout << "Find the string, the start pos is: " << pos << std::endl;}// 从右往左查找int pos2 = str1.rfind("cd");if (pos2 == -1){std::cout << "The dst string is not exist";}else{std::cout << "Find the string, the start pos is: " << pos2 << std::endl;}// 替换std::string str2 = "abcdefg";str2.replace(1, 3, "123456"); // 先在原字符串从位置 1 开始删除 3 个字符,再将目标字符串复制到原字符串std::cout << "str2: " << str2 << std::endl;return 0;
}
1-5--string字符串比较
字符串比较是按字符的 ASCII 码进行比较,有以下三种情况:① =,返回 0; ② >,返回1;③ <,返回 -1;
函数原型:
int compare(const string &s) const; // 与字符串 s 比较
int compare(const char *s) const; // 与字符串 s 比较
#include <iostream>
#include <string>
int main(int argc, char* argv[]){std::string str1 = "C++";std::string str2 = "C++";if(str1.compare(str2) == 0){std::cout << "str1 == str2" << std::endl;}else if(str1.compare(str2) > 0){std::cout << "str1 > str2" << std::endl;}else{std::cout << "str1 < str2" << std::endl;}return 0;
}
1-6--string字符串存取
string中单个字符存取方式有两种:
char& operator[](int n); // 通过[]方式取字符
char& at(int n); // 通过at方法获取字符
#include <iostream>
#include <string>
int main(int argc, char* argv[]){std::string str1 = "Hello";std::cout << "str1: " << str1 << std::endl;// 通过[]访问单个字符for(int i = 0; i < str1.size(); i++){std::cout << str1[i] << " ";}std::cout << std::endl;// 通过at访问单个字符for(int i = 0; i < str1.size(); i++){std::cout << str1.at(i) << " ";}std::cout << std::endl;// 修改单个字符str1[0] = 'A';str1.at(1) = 'B';std::cout << "str1: " << str1 << std::endl;return 0;
}
1-7--string字符串插入和删除
对 string 字符串进行插入和删除字符操作,其函数原型如下:
string& insert(int pos, const char* s); // 插入字符串
string& insert(int pos, const string& str); // 插入字符串
string& insert(int pos, int n, char c); // 在指定位置插入 n 个字符c
string& erase(int pos, int n = npos); // 删除从 Pos 开始的 n 个字符
#include <iostream>
#include <string>
int main(int argc, char* argv[]){std::string str1 = "Hello";std::cout << "str1: " << str1 << std::endl;// 插入字符串str1.insert(1, "AAA"); // 第一个参数表示插入的位置,第二个参数表示插入的字符串std::cout << "str1: " << str1 << std::endl;// 删除字符串str1.erase(1, 3); // 第一个参数表示删除的位置,第二个参数表示删除的个数std::cout << "str1: " << str1 << std::endl;return 0;
}
1-8--获取string子串
在规定位置截取string字符串的子串,其函数原型如下:
std::string substr(int pos = 0, int n = npos) const; // 返回由pos开始的n个字符组成的字符串
#include <iostream>
#include <string>
int main(int argc, char* argv[]){std::string str1 = "123456@sysu.edu.cn";int pos = str1.find("@");std::string subStr = str1.substr(0, pos);std::cout << "subStr = " << subStr << std::endl;return 0;
}
2--vector容器
vector 数据结构与数组类似,被称为单端数组;
vector 与普通数组的区别在于:普通数组时静态空间,而 vector 可以动态扩展;
2-1--vector构造函数
用于创建 vector 容器,其函数原型如下:
vector<T> v; // 默认构造函数
vector(v.begin(), v.end()); // 将v[begin(), end()]区间中的元素拷贝到容器
vector(n, elem); // 构造函数将n个elem拷贝到容器
vector(const vector &vec); // 拷贝构造函数
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; // 默认构造for(int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);std::vector<int>v2(v1.begin(), v1.end()); // 利用区间进行构造printVector(v2);// n 个 elem 方式构造std::vector<int>v3(10, 100); // 10个100printVector(v3);//拷贝构造std::vector<int>v4(v3);printVector(v4);
}int main(){test01();return 0;
}
2-2--vector赋值操作
vector容器赋值操作的函数原型如下:
vector& operator=(const vector &vec); // 重载等号操作符
assign(beg, end); // 将[beg, end]区间中的数据拷贝赋值给容器
assign(n, elem); // 将n个elem拷贝赋值给容器
# include <iostream>
# include <vector>void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; for(int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);// =赋值std::vector<int> v2;v2 = v1;printVector(v2);// assign赋值std::vector<int> v3;v3.assign(v1.begin(), v1.end());printVector(v3);std::vector<int> v4;v4.assign(10, 100);printVector(v4);
}int main(){test01();return 0;
}
2-3--vector容器的容量和大小
通过以下函数可以对vector容器的容量和大小进行操作:
empty(); // 判断容器是否为空
capacity(); // 容器的容量
size(); // 返回容器中元素的个数
resize(int num); // 重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素将会被删除;
resize(int num, elem); // 重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素将会被删除;
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; for(int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);if(v1.empty()){std::cout << "The vector is empty" << std::endl;}else{std::cout << "The vector is not empty" << std::endl;std::cout << "The capacity is: " << v1.capacity() << std::endl;std::cout << "The size is:" << v1.size() << std::endl;}// resizev1.resize(15);printVector(v1); // 默认以0填充v1.resize(20, 1);printVector(v1);v1.resize(10);printVector(v1);}int main(){test01();return 0;
}
2-4--vector的插入和删除
通过以下函数实现对vector容器的插入和删除:
push_back(ele); // 尾部插入元素ele
pop_back(); // 删除最后一个元素
insert(const_iterator pos, ele); // 迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count, ele); // 迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); // 删除迭代器指向的元素
erase(const_iterator start, const_iterator end); // 删除迭代器从start到end之间的元素
clear(); // 删除容器中所有元素
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; // 尾插v1.push_back(10);v1.push_back(20);v1.push_back(30);printVector(v1);// 尾删v1.pop_back();printVector(v1);// 插入v1.insert(v1.begin(), 1);printVector(v1);v1.insert(v1.begin(), 2, 66); // 开头插入2个66printVector(v1);v1.erase(v1.begin());printVector(v1);v1.erase(v1.begin(), v1.end() - 1);printVector(v1);v1.clear();printVector(v1);
}int main(){test01();return 0;
}
2-5--vector数据存取
使用以下函数可以实现对vector容器的数据存取:
at(int idx); // 返回索引idx所指的数据
operator[]; // 返回索引idx所指的数据
front(); // 返回容器中第一个数据元素
back(); // 返回容器中最后一个数据元素
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; for(int i = 0; i < 10; i++){v1.push_back(i);}// 通过[]访问for(int i = 0; i < v1.size(); i++){std::cout<< v1[i] << " ";}std::cout << std::endl;// 通过at访问for(int i = 0; i < v1.size(); i++){std::cout<< v1.at(i) << " ";}std::cout << std::endl;// 获取第一个元素std::cout << "The first elem is: " << v1.front() << std::endl;// 获取最后一个元素std::cout << "The last elem is: " << v1.back() << std::endl;}int main(){test01();return 0;
}
2-6--vector容器互换
通过以下函数实现两个容器的互换:
swap(vec); // 将vec容器的元素和原来容器的元素进行互换;
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; for(int i = 0; i < 10; i++){v1.push_back(i);}std::vector<int> v2;for(int i = 10; i > 0; i--){v2.push_back(i);}std::cout << "互换前: " << std::endl;printVector(v1);printVector(v2);std::cout << "互换后: " << std::endl;v1.swap(v2);printVector(v1);printVector(v2);}void test02(){std::vector<int>v1; for(int i = 0; i < 100000; i++){v1.push_back(i);}std::cout << "v1.capacity: " << v1.capacity() << std::endl;std::cout << "v1.size: " << v1.size() << std::endl;v1.resize(3); // 重新指定大小,但容量并没有减少std::cout << "v1.capacity: " << v1.capacity() << std::endl;std::cout << "v1.size: " << v1.size() << std::endl;// 使用swap收缩内存std::vector<int>(v1).swap(v1); // std::vector<int>(v1)匿名对象std::cout << "v1.capacity: " << v1.capacity() << std::endl;std::cout << "v1.size: " << v1.size() << std::endl;}int main(){test02();return 0;
}
2-7--vector预留空间
通过预留空间可以减少vector在动态扩展容量时的扩展次数;
reserve(int len); // 容器预留 len 个元素长度,预留位置不初始化,元素不可访问;
# include <iostream>
# include <vector>
// # include <string>
// # include <algorithm> // 标准算法的头文件void printVector(std::vector<int> &v){for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test01(){std::vector<int>v1; int num1 = 0; // 统计开辟次数int *p1 = NULL;for(int i = 0; i < 100000; i++){v1.push_back(i);if(p1 != &v1[0]){p1 = &v1[0];num1++;}}std::cout << "num: " << num1 << std::endl;// 利用reserve()预留空间std::vector<int>v2; v2.reserve(100000);int num2 = 0; // 统计开辟次数int *p2 = NULL;for(int i = 0; i < 100000; i++){v2.push_back(i);if(p2 != &v2[0]){p2 = &v2[0];num2++;}}std::cout << "num: " << num2 << std::endl;
}int main(){test01();return 0;
}
相关文章:
C++复习笔记--STL的string容器和vector容器
1--string容器string 本质上是一个类,其不同于指针 char*,string 类的内部封装了 char*,用于管理字符串,是一个 char* 型的容器;1-1--string构造函数string 的构造函数原型:string(); // 创建一个空的字符串…...
第一章 软件项目管理概述
项目(Project)是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力。项目的特征PMBOK(A guide to the Project management Body Of Knowledge:项目管理知识体系指南)五大过程组和十大知识领域从时间角度出发,项目管理分为五大过程组:启动…...
【Linux系统编程】06:共享内存
共享内存 OVERVIEW共享内存一、文件上锁flock二、共享内存1.关联共享内存ftok2.获取共享内存shmget3.绑定共享内存shmat4.绑定分离shmdt5.控制共享内存shmctl三、亲缘进程间通信1.共享内存写入与读取2.共享内存解绑与删除3.共享内存综合四、非亲缘进程间通信1.通过sleep同步2.通…...
【专项】112. 路径总和
112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 …...
【数据结构】堆排序
堆是一种叫做完全二叉树的数据结构,可以分为大根堆,小根堆,而堆排序就是基于这种结构而产生的一种程序算法。大堆:每个节点的值都大于或者等于他的左右孩子节点的值小堆:每个结点的值都小于或等于其左孩子和右孩子结点…...
论文阅读笔记《GAMnet: Robust Feature Matching via Graph Adversarial-Matching Network》
核心思想 本文提出一种基于图对抗神经网络的图匹配算法(GAMnet),使用图神经网络作为生成器分别生成源图和目标图的节点的特征,并用一个多层感知机作为辨别器来区分两个特征是否来自同一个图,通过对抗训练的办法提高生成器特征提取…...
数据安全—数据完整性校验
1、数据安全保障三要素即 保密性 完整性、可用性机密性:要求数据不被他人轻易获取,需要进行数据加密。完整性:要求数据不被他人随意修改,需要进行签名技术可用性:要求服务不被他人恶意攻击,需要进行数据校验…...
Java 最小路径和
最小路径和中等给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例 1:输入:grid [[1,3,1],[1,5,1],[4,2,1]]输出&…...
Flask+VUE前后端分离的登入注册系统实现
首先Pycharm创建一个Flask项目: Flask连接数据库需要下载的包: pip install -U flask-cors pip install flask-sqlalchemy Flask 连接和操作Mysql数据库 - 王滚滚啊 - 博客园 (cnblogs.com) sqlAlchemy基本使用 - 简书 (jianshu.com) FlaskVue前后端分…...
【Go】用Go在命令行输出好看的表格
用Go在命令行输出好看的表格前言正文生成Table表头设置插入行表格标题自动标号单元格合并列合并行合并样式设置居中设置数字自动高亮标红完整Demo代码结语前言 最近在写一些运维小工具,比如批量进行ping包的工具,实现不困难,反正就是ping&am…...
怎么处理消息重发的问题?
消息队列在消息传递的过程中,如果出现传递失败的情况,发送方会重试,在重试的过程中,可能会产生重复的消息。 消息重复的情况必然存在 关于传递消息时能够提供的服务质量标准,MQTT协议给出了三种不同的标准࿱…...
JVM 运行时数据区(数据区组成表述,程序计数器,java虚拟机栈,本地方法栈)
JVM 运行时数据区JVM 运行时数据区3.1运行时的数据区组成概述3.1.1程度计数器3.1.2java虚拟机栈3.1.3本地方法栈3.1.4java堆3.1.5方法区3.2程序计数器3.3java虚拟机栈3.4本地方法栈JVM 运行时数据区 堆,方法区(元空间) 主要用来存放数据 是线程共享的. 程序计数器,本地方法栈…...
Oracle ASM磁盘组配置、日常运维、故障处理等操作资料汇总
ASM(自动存储管理)在数据库中是非常重要的组成部分,它可以为磁盘提供统一的存储管理、提高磁盘访问的性能和可用性、简化管理复杂度,从而为数据库的运行提供更好的支持。这里就为大家整理了墨天轮数据社区上一些ASM相关基础知识、…...
java对象的创建与内存分配机制
文章目录对象的创建与内存分配机制对象的创建类加载检查分配内存初始化零值设置对象头指向init方法其他:指针压缩对象内存分配对象在栈上分配对象在Eden区中分配大对象直接分配到老年代长期存活的对象进入老年代对象动态年龄判断老年代空间分配担保机制对象的内存回…...
本地存储localStorage、sessionStorage
目录 一、localStorage 二、sessionStorage 三、本地存储处理复杂数据 一、localStorage 介绍 (1)数据存储在用户浏览器中 (2)设置、读取方便、甚至页面刷新不会丢失数据 (3)容量较大,se…...
JavaSE: 网络编程
1.1 概述java程序员面对统一的网络编程环境B/S 架构 和 C/S架构1.2 网络通信的两个要素通信双方的地址:ip 端口号网络通信协议:TCP/IP协议(事实上的国际规则)、OSI模型(理想化)1.3 Inet Address本地回环地…...
计算机图形学09:二维观察之点的裁剪
作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本…...
2023Java 并发编程面试题
Java 并发编程 1、在 java 中守护线程和本地线程区别? java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(boolon…...
CAD如何绘制A0/A1/A2/A3/A4图框?
在CAD制图时,设计师一般会使用企业的定制图框模板或者个人的特色图框模板,让设计方案更加标准化、规范化。对于新人设计师而言,完成CAD制图已经非常头疼了,图框的绘制更是手忙脚乱。那么是否有更加高效的方式来完成A0、A1、A2、A3…...
R 安装 “umap-learn“ python 包
首先需要在R中下载并读取reticulate包,该包提供了一系列R-Python的交互式命令由于之前在电脑中通过三个方式安装了Python:直接安装 Python 3.10安装Anaconda,携带3.9安装 Miniconda,又是另外一个版本的Python版本各不相同…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动
飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S(Inter-Integrated Circuit Sound)是一种用于传输数字音频数据的通信协议,广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设,通过配置…...
MyBatis-Plus 常用条件构造方法
1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...
