浅谈C++|STL之string篇

一.string的基本概念
本质
string是C++风格的字符串,而string本质是一个字符串
string和char * 区别
- char * 是一个指针
- string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型容器。
特点
string类内部封装了很多成员方法
例如:查找find,拷贝copy,删除delete替换replace,插入insert
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
二.string构造函数
以下是std::string的构造函数原型整理成表格的形式:
| 构造函数 | 描述 |
|---|---|
| string() | 默认构造函数 |
| string(const char* s) | 使用C风格字符串构造函数 |
| string(const char* s, size_t n) | 使用C风格字符串和长度构造函数 |
| string(size_t n, char c) | 使用重复字符构造函数 |
| string(const string& str) | 拷贝构造函数 |
| string(string&& str) noexcept | 移动构造函数 |
| template string(InputIterator first, InputIterator last) | 使用迭代器范围构造函数 |
| string(initializer_list ilist) | 使用初始化列表构造函数 |
#include <iostream>
#include <string>
using namespace std;
int main() {//默认构造函数string str1;string str2("使用C风格字符串构造函数");string str3("使用C风格字符串和长度构造函数", 5);string str4(10, 'a');string str = "拷贝构造函数";string str5(str);string&& str6 = move("移动构造函数");str = "使用迭代器范围构造函数";string str7(str.begin(), str.end());string str8[2] = { "使用初始化", "列表构造函数" };cout << "wetr";cout << str1 << endl;cout << str2 << endl;cout << str3 << endl;cout << str4 << endl;cout << str5 << endl;cout << str6 << endl;cout << str7 << endl;cout << str8[1]<< str8[2] << endl;return 0;
}
![2023-09-01T01:46:05.png][1]
二.string的赋值操作
以下是std::string的赋值操作函数原型整理成表格的形式:
| 函数原型 | 描述 |
|---|---|
string& operator=(const string& str) | 赋值运算符重载:从另一个字符串赋值 |
string& operator=(string&& str) noexcept | 赋值运算符重载:移动赋值 |
string& operator=(const char* s) | 赋值运算符重载:从C风格字符串赋值 |
string& operator=(char c) | 赋值运算符重载:从单个字符赋值 |
string& operator=(initializer_list<char> ilist) | 赋值运算符重载:从初始化列表赋值 |
string& assign(const string& str) | 成员函数:从另一个字符串赋值 |
string& assign(string&& str) noexcept | 成员函数:移动赋值 |
string& assign(const char* s) | 成员函数:从C风格字符串赋值 |
string& assign(const char* s, size_t n) | 成员函数:从C风格字符串和长度赋值 |
string& assign(size_t n, char c) | 成员函数:使用重复字符赋值 |
string& assign(initializer_list<char> ilist) | 成员函数:从初始化列表赋值 |
string& assign(const_iterator first, const_iterator last) | 成员函数:使用迭代器范围赋值 |
#include <iostream>
#include <string>
using namespace std;
int main() {string str1;str1 = "从另一个字符串赋值";cout << str1 << endl;str1 = move("移动赋值");cout << str1 << endl;str1 = "从C风格字符串赋值";cout << str1 << endl;string str = " 使用迭代器范围赋值";str1.assign(str.begin()+2, str.end());cout << str1 << endl;return 0;
}
![2023-09-01T02:02:34.png][2]
三.string拼接操作
以下是std::string的字符串拼接操作函数原型整理成表格的形式:
| 函数原型 | 描述 |
|---|---|
string operator+(const string& lhs, const string& rhs) | 运算符重载:字符串与字符串的拼接 |
string operator+(const string& lhs, const char* rhs) | 运算符重载:字符串与C风格字符串的拼接 |
string operator+(const char* lhs, const string& rhs) | 运算符重载:C风格字符串与字符串的拼接 |
string operator+(const string& lhs, char rhs) | 运算符重载:字符串与单个字符的拼接 |
string operator+(char lhs, const string& rhs) | 运算符重载:单个字符与字符串的拼接 |
string& append(const string& str) | 成员函数:追加拼接另一个字符串 |
string& append(const string& str, size_t subpos, size_t sublen) | 成员函数:从另一个字符串的指定位置截取指定长度后进行拼接 |
string& append(const char* s) | 成员函数:追加拼接C风格字符串 |
string& append(const char* s, size_t n) | 成员函数:追加拼接C风格字符串的指定长度 |
string& append(size_t n, char c) | 成员函数:追加拼接指定数量的重复字符 |
string& append(initializer_list<char> ilist) | 成员函数:追加拼接初始化列表中的字符 |
#include <iostream>
#include <string>
using namespace std;
int main() {string str;string str1 = "01234567";str += "hello";str += string("word");str += (string(" word") + "20 ");str.append(str1, 5, 2);cout << str;return 0;
}
四.string的查找和替换
下面是关于std::string查找和替换的常用函数原型:
查找相关函数:
| 函数原型 | 描述 |
|---|---|
size_t find(const string& str, size_t pos = 0) const noexcept; | 在字符串中查找另一个字符串的位置 |
size_t find(const char* s, size_t pos = 0) const; | 在字符串中查找C风格字符串的位置 |
size_t find(char c, size_t pos = 0) const noexcept; | 在字符串中查找字符的位置 |
size_t rfind(const string& str, size_t pos = npos) const noexcept; | 在字符串中从后往前查找另一个字符串的位置 |
size_t rfind(const char* s, size_t pos = npos) const; | 在字符串中从后往前查找C风格字符串的位置 |
size_t rfind(char c, size_t pos = npos) const noexcept; | 在字符串中从后往前查找字符的位置 |
size_t find_first_of(const string& str, size_t pos = 0) const noexcept; | 在字符串中查找第一个匹配另一个字符串中任意字符的位置 |
size_t find_first_of(const char* s, size_t pos = 0) const; | 在字符串中查找第一个匹配C风格字符串中任意字符的位置 |
size_t find_first_of(char c, size_t pos = 0) const noexcept; | 在字符串中查找第一个匹配字符的位置 |
size_t find_last_of(const string& str, size_t pos = npos) const noexcept; | 在字符串中从后往前查找第一个匹配另一个字符串中任意字符的位置 |
size_t find_last_of(const char* s, size_t pos = npos) const; | 在字符串中从后往前查找第一个匹配C风格字符串中任意字符的位置 |
size_t find_last_of(char c, size_t pos = npos) const noexcept; | 在字符串中从后往前查找第一个匹配字符的位置 |
size_t find_first_not_of(const string& str, size_t pos = 0) const noexcept; | 在字符串中查找第一个不匹配另一个字符串中任意字符的位置 |
size_t find_first_not_of(const char* s, size_t pos = 0) const; | 在字符串中查找第一个不匹配C风格字符串中任意字符的位置 |
size_t find_first_not_of(char c, size_t pos = 0) const noexcept; | 在字符串中查找第一个不匹配字符的位置 |
size_t find_last_not_of(const string& str, size_t pos = npos) const noexcept; | 在字符串中从后往前查找第一个不匹配另一个字符串中任意字符的位置 |
size_t find_last_not_of(const char* s, size_t pos = npos) const; | 在字符串中从后往前查找第一个不匹配C风格字符串中任意字符的位置 |
size_t find_last_not_of(char c, size_t pos = npos) const noexcept; | 在字符串中从后往前查找第一个不匹配字符的位置 |
替换相关函数:
| 函数原型 | 描述 |
|---|---|
string& replace(size_t pos, size_t len, const string& str); | 替换指定位置和长度的子字符串为另一个字符串 |
string& replace(size_t pos, size_t len, const char* s); | 替换指定位置和长度的子字符串为C风格字符串 |
string& replace(size_t pos, size_t len, const char* s, size_t n); | 替换指定位置和长度的子字符串为C风格字符串的指定长度 |
string& replace(size_t pos, size_t len, size_t n, char c); | 替换指定位置和长度的子字符串为指定数量的重复字符 |
string& replace(iterator first, iterator last, const string& str); | 替换迭代器范围内的子字符串为另一个字符串 |
string& replace(iterator first, iterator last, const char* s); | 替换迭代器范围内的子字符串为C风格字符串 |
string& replace(iterator first, iterator last, const char* s, size_t n); | 替换迭代器范围内的子字符串为C风格字符串的指定长度 |
string& replace(iterator first, iterator last, size_t n, char c); | 替换迭代器范围内的子字符串为指定数量的重复字符 |
#include <iostream>
#include <string>
using namespace std;
int main() {string str = "1234578912345789";int a = str.find("78");cout << a << endl;a = str.rfind("78");cout << a << endl;//从下标1开始的三个字符替换成abcdstr.replace(1, 3, "abcd");cout << str << endl;return 0;
}
![2023-09-01T02:19:00.png][3]
五.string的字符串比较
下面是关于std::string比较的常用函数原型:
| 函数原型 | 描述 |
|---|---|
int compare(const string& str) const noexcept; | 比较字符串和另一个字符串 |
int compare(size_t pos, size_t len, const string& str) const; | 比较字符串的子串和另一个字符串 |
int compare(const char* s) const; | 比较字符串和C风格字符串 |
int compare(size_t pos, size_t len, const char* s) const; | 比较字符串的子串和C风格字符串 |
int compare(size_t pos, size_t len, const char* s, size_t n) const; | 比较字符串的子串和指定长度的C风格字符串 |
上述函数通过返回整数值来表示比较的结果,其返回值的含义如下:
-
返回值 < 0 表示当前字符串小于目标字符串。
-
返回值 > 0 表示当前字符串大于目标字符串。
-
返回值 = 0 表示当前字符串等于目标字符串。
#include
#include
using namespace std;
int main() {
string str = “1234578912345789”;
//从0下标开始的6个字符的子串,后一个的字串比较
int m=str.compare(0,6, “12345789”, 6);
cout << m << endl;
return 0;
}
六.string字符串存取
下面是关于std::string字符串存取的常用函数原型:
| 函数原型 | 描述 |
|---|---|
char& operator[](size_t pos); | 访问字符串中指定位置的字符 |
const char& operator[](size_t pos) const; | 访问字符串中指定位置的字符(const版本) |
char& at(size_t pos); | 访问字符串中指定位置的字符,带范围检查 |
const char& at(size_t pos) const; | 访问字符串中指定位置的字符,带范围检查(const版本) |
char& front(); | 访问字符串的第一个字符 |
const char& front() const; | 访问字符串的第一个字符(const版本) |
char& back(); | 访问字符串的最后一个字符 |
const char& back() const; | 访问字符串的最后一个字符(const版本) |
const char* data() const noexcept; | 返回字符串数据的指针 |
const char* c_str() const noexcept; | 返回以空字符结尾的字符串的指针(C风格字符串) |
const char* data() const noexcept; | 返回字符串数据的指针 |
const char* c_str() const noexcept; | 返回以空字符结尾的字符串的指针(C风格字符串) |
这些函数允许您对std::string对象进行字符的存取操作,可以直接访问特定位置的字符,或者获取字符串的首尾字符。data()和c_str()函数还可以返回字符串数据的指针(以及以空字符结尾的C风格字符串的指针),方便与C语言接口进行交互操作。请注意,在只读的场景下使用at()函数可以提供范围检查,避免越界访问。
七.string的插入和删除
下面是关于std::string插入和删除字符串的常用函数原型:
| 函数原型 | 描述 |
|---|---|
string& insert(size_t pos, const string& str); | 在指定位置插入另一个字符串 |
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen); | 在指定位置插入另一个字符串的子串 |
string& insert(size_t pos, const char* s); | 在指定位置插入C风格字符串 |
string& insert(size_t pos, const char* s, size_t n); | 在指定位置插入指定长度的C风格字符串 |
string& insert(size_t pos, size_t n, char c); | 在指定位置插入指定数量的字符 |
iterator insert(iterator p, char c); | 在指定位置插入单个字符 |
iterator insert(iterator p, size_t n, char c); | 在指定位置插入指定数量的字符 |
iterator insert(iterator p, InputIt first, InputIt last); | 在指定位置插入迭代器范围的字符 |
template <class InputIt> void insert(iterator p, InputIt first, InputIt last); | 在指定位置插入迭代器范围的字符 |
template <class InputIt> void insert(iterator p, initializer_list<typename InputIt::value_type> ilist); | 在指定位置插入初始化列表的字符 |
string& erase(size_t pos = 0, size_t len = npos); | 删除字符串的子串 |
iterator erase(iterator p); | 删除指定位置的字符 |
iterator erase(iterator first, iterator last); | 删除迭代器范围内的字符 |
这些插入和删除函数允许您在
std::string对象中插入或删除字符串内容。通过这些函数,您可以在指定位置插入字符串、字符或字符范围,也可以删除字符串子串、指定位置的字符或一段字符范围。这些函数提供了灵活的方式来操作字符串,满足不同场景下的需求。
八.获得string的子串
以下是使用substr函数获取字符串子串的表格总结:
| 函数原型 | 描述 |
|---|---|
string substr(size_t pos = 0, size_t len = npos) const; | 获取从指定位置开始的一段子串 |
示例:
std::string str = "Hello, World!";
std::string sub1 = str.substr(7); // "World!"
std::string sub2 = str.substr(0, 5); // "Hello"
std::string sub3 = str.substr(7, 5); // "World"
使用substr函数,您可以方便地获得std::string的子串,通过指定起始位置和长度参数来进行操作。
九.函数接口
| 序号 | 函数接口 | 功能描述 |
|---|---|---|
| 1 | push_back© | 在字符串的末尾添加字符 c |
| 2 | pop_back() | 删除字符串的最后一个字符 |
| 3 | resize(n) | 调整字符串的大小为 n |
| 4 | resize(n, c) | 调整字符串的大小为 n,并将新增的元素初始化为字符 c |
| 5 | front() | 返回字符串的第一个字符 |
| 6 | back() | 返回字符串的最后一个字符 |
| 7 | find_first_of(str) | 在字符串中查找字符串 str 中的任意字符第一次出现的位置 |
| 8 | find_first_not_of(str) | 在字符串中查找字符串 str 中的任意字符第一次不出现的位置 |
| 9 | find_last_of(str) | 在字符串中从后往前查找字符串 str 中的任意字符最后一次出现的位置 |
| 10 | find_last_not_of(str) | 在字符串中从后往前查找字符串 str 中的任意字符最后一次不出现的位置 |
| 11 | toLowerCase() | 将字符串中的字母全部转换为小写 |
| 12 | toUpperCase() | 将字符串中的字母全部转换为大写 |
| 13 | at(n) | 返回字符串中索引为 n 的字符 |
| 14 | operator[] (n) | 返回字符串中索引为 n 的字符 |
| 15 | substr(pos) | 返回从位置 pos 开始到字符串末尾的子字符串 |
| 16 | compare(pos, len, str) | 将字符串中从位置 pos 开始的长度为 len 的子字符串与字符串 str 比较 |
| 17 | getline(input_stream, str, delimiter) | 从输入流 input_stream 中读取一行文本,并将结果存储到字符串 str 中 |
| 18 | stoi(str) | 将字符串 str 转换为整数值 |
| 19 | stol(str) | 将字符串 str 转换为长整数值 |
| 20 | stof(str) | 将字符串 str 转换为浮点数值 |
| 21 | to_string(value) | 将值 value 转换为字符串 |
| 22 | find_last_of(str, pos) | 在字符串中从位置 pos 开始从后往前查找字符串 str 第一次出现的位置 |
| 23 | find_last_not_of(str, pos) | 在字符串中从位置 pos 开始从后往前查找字符串 str 第一次不出现的位置 |
| 24 | replace(pos, len, newstr, newlen) | 将字符串中从位置 pos 开始的长度为 len 的子字符串替换为新的字符串 |
| 25 | find_first_of(str, pos) | 在字符串中从位置 pos 开始查找字符串 str 中的任意字符第一次出现的位置 |
| 26 | find_first_not_of(str, pos) | 在字符串中从位置 pos 开始查找字符串 str 中的任意字符第一次不出现的位置 |
| 27 | compare(pos, len, str, subpos, sublen) | 将字符串中从位置 pos 开始的长度为 len 的子字符串与字符串 str 中从位置 subpos 开始的长度为 sublen 的子字符串进行比较 |
| 28 | replace(pos, len, str) | 将字符串中从位置 pos 开始的长度为 len 的子字符串替换为字符串 str |
| 29 | capacity() | 返回字符串当前能够容纳的字符数 |
| 30 | reserve(n) | 将字符串的容量设置为至少为 n 个字符 |
| 31 | shrink_to_fit() | 将字符串的容量调整为与字符串的长度相匹配,以节省内存空间 |
| 32 | find_last_of(str, pos) | 在字符串中从位置 pos 开始从后往前查找字符串 str 中的任意字符最后一次出现的位置 |
| 33 | find_last_not_of(str, pos) | 在字符串中从位置 pos 开始从后往前查找字符串 str 中的任意字符最后一次不出现的位置 |
| 34 | replace(pos, len, newstr) | 将字符串中从位置 pos 开始的长度为 len 的子字符串替换为新的字符串 |
| 35 | replace(iterator1, iterator2, newstr) | 将迭代器 iterator1 和 iterator2 之间的子字符串替换为新的字符串 |
| 36 | copy(char_array, len, pos) | 将字符串中从位置 pos 开始的长度为 len 的子字符串复制到字符数组 char_array 中 |
| 37 | find_if(predicate) | 在字符串中查找满足谓词函数 predicate 的第一个字符的位置 |
| 38 | rfind(str) | 在字符串中从后往前查找子字符串 str 并返回第一次出现的位置 |
| 39 | rfind(str, pos) | 在字符串中从位置 pos 开始从后往前查找子字符串 str 并返回第一次出现的位置 |
| 40 | replace_if(predicate, newstr) | 将字符串中满足谓词函数 predicate 的字符替换为新的字符串 |
请注意,这里的表格仅提供了功能描述的简要介绍,具体的函数行为和参数要求请查阅官方文档以获取详细信息。
相关文章:
浅谈C++|STL之string篇
一.string的基本概念 本质 string是C风格的字符串,而string本质是一个字符串 string和char * 区别 char * 是一个指针string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型容器。 特点 string类内部封装了很多成…...
Kubernetes Dashboard安装部署
Kubernetes Dashboard安装部署 1. 下载Dashboard 部署文件2. 修改yaml配置文件3. 应用安装,查看pod和svc4. 创建dashboard服务账户5. 创建admin-user用户的登录密钥6. 登录6.1 使用token登录(1) 短期token(2) token长期有效 6.2 使用 Kubeconfig 文件登录 7.安装met…...
在Qt的点云显示窗口中添加坐标轴C++
通过摸索整理了三个方法: 一、方法1://不推荐,但可以参考 1、通过pcl的compute3DCentroid()方法计算点云的中心点坐标; 函数原型如下: compute3DCentroid (const pcl::PointCloud<PointT> &cloud, Eigen…...
[密码学入门]凯撒密码(Caesar Cipher)
密码体质五元组:P,C,K,E,D P,plaintext,明文空间 C,ciphertext,密文空间 K,key,密钥空间 E,encrypt,加密算法 D,decrypt,解密算法 单表代换…...
uboot 顶层Makefile-make xxx_deconfig过程说明三
一. uboot 的 make xxx_deconfig配置 本文接上一篇文章的内容。地址如下:uboot 顶层Makefile-make xxx_deconfig过程说明二_凌肖战的博客-CSDN博客 本文继续来学习 uboot 源码在执行 make xxx_deconfig 这个配置过程中,顶层 Makefile有关的执行思路。 …...
c++中的多线程通信
信息传递 #include <iostream> #include <thread> #include <chrono> #include <mutex> #include <condition_variable> #include <queue> // 用于存储和同步数据的结构 struct Data {std::queue<std::string> messag…...
IO day7
1->x.mind 2-> A进程 B进程...
C语言之指针进阶篇(3)
目录 思维导图 回调函数 案例1—计算器 案例2—qsort函数 关于qsort函数 演示qsort函数的使用 案例3—冒泡排序 整型数据冒泡排序 回调函数搞定各类型冒泡排序 cmp_int比较大小 cmp传参数 NO1. NO2. 解决方案 交换swap 总代码 今天我们学习指针难点之回调函数…...
SQL7 查找年龄大于24岁的用户信息
描述 题目:现在运营想要针对24岁以上的用户开展分析,请你取出满足条件的设备ID、性别、年龄、学校。 用户信息表:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20…...
vite搭建vue3项目
参考视频 1.使用npm搭建vite项目,会自动搭建vue3项目 npm create vitelatest yarn create vite2.手动搭建vue3项目 创建一个项目名称的文件夹执行命令:npm init -y 快速的创建一个默认的包信息安装vite: npm i vite -D -D开发环境的依赖 安装vue,现在默认是vue3.…...
Qt中表格属性相关操作,调整表格宽度高度自适应内容等
1 表格列宽设置 利用Qt designer设计,可以通过改变表头的列宽从而保证内容不会被遮盖,输入空格的方式增加表头的长度,比如表头为"Value",则改成"Value ",可以扩展列默认的宽度,保证后面…...
NLP机器翻译全景:从基本原理到技术实战全解析
目录 一、机器翻译简介1. 什么是机器翻译 (MT)?2. 源语言和目标语言3. 翻译模型4. 上下文的重要性 二、基于规则的机器翻译 (RBMT)1. 规则的制定2. 词典和词汇选择3. 限制与挑战4. PyTorch实现 三、基于统计的机器翻译 (SMT)1. 数据驱动2. 短语对齐3. 评分和选择4. PyTorch实现…...
docker四种网络模式
文章目录 一.为什么要了解docker网络二.docker 网络理论三.docker的四类网络模式3.1 bridge模式3.2 host模式3.3 container模式3.4 none模式 四.bridge模式下容器的通信4.1 防火墙开启状态4.2 防火墙关闭状态 一.为什么要了解docker网络 当你开始大规模使用Docker时࿰…...
C 风格文件输入/输出---无格式输入/输出---(std::fgetc,std::getc,std::fgets)
C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 无格式输入/输出 从文件流获取字符 std::fgetc, std::getc …...
多线程之间如何进行通信 ?
实现多线程之间通信的方式有多种,以下是一些常见的方式: 共享变量:多个线程共享一个变量,通过互斥锁(如synchronized关键字)来保护对该变量的访问,确保线程之间的安全通信。 wait() 和 notify() / notifyAll():通过Object类的wait()方法使线程等待,然后使用notify()或…...
二叉树顺序存储结构
目录 1.二叉树顺序存储结构 2.堆的概念及结构 3.堆的相关接口实现 3.1 堆的插入及向上调整算法 3.1.1 向上调整算法 3.1.2 堆的插入 3.2 堆的删除及向下调整算法 3.2.1 向下调整算法 3.2.2 堆的删除 3.3 其它接口和代码实现 4.建堆或数组调堆的两种方式及复杂度分析…...
Apache HTTPD 多后缀解析漏洞复现
Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如,如下配置文件: AddType text/html .html AddLanguage zh-CN .cn 其给.html后缀增加了media-type,值为text/html;给.cn后缀增加了语言&…...
【深入浅出C#】章节10: 最佳实践和性能优化:内存管理和资源释放
一、 内存管理基础 1.1 垃圾回收机制 垃圾回收概述 垃圾回收(Garbage Collection)是一种计算机科学和编程领域的重要概念,它主要用于自动管理计算机程序中的内存分配和释放。垃圾回收的目标是识别和回收不再被程序使用的内存,以…...
我的创作纪念日——1个普通网安人的漫谈
机缘 大家好,我是zangcc。今天突然收到了一条私信,才发现来csdn已经1024天了,不知不觉都搞安全渗透2年半多了🐔,真是光阴似箭。 我写博客的初衷只是记录自己的学习历程,比如打打靶场,写一下通关…...
Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory
文章目录 参考博客: Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory 首先在此对这位博主表示感谢。 运行bash脚本会出现两个文件,1037.err和1037.out。 1037.err的文件内容如下: /data/home/user12/.lsbat…...
OpenAI推出Safety Bug Bounty计划:聚焦AI滥用与安全风险
OpenAI正式启动公共Safety Bug Bounty(安全漏洞赏金计划),旨在鼓励全球研究人员识别其产品中存在的AI滥用行为和安全风险。该计划托管于Bugcrowd平台,是对现有Security Bug Bounty的重要补充,专门处理那些虽不符合传统…...
多模态学习:结合文本和图像的旋转判断
多模态学习:结合文本和图像的旋转判断 1. 引言 你有没有遇到过这样的情况:拍了一张带文字的图片,结果发现方向不对,需要手动旋转才能正常阅读?传统的图像旋转判断方法往往只依赖视觉特征,对于包含文字的图…...
TFT LCD屏幕硬件解析:从XPT2046触摸屏到背光控制的完整指南
TFT LCD屏幕硬件解析:从XPT2046触摸屏到背光控制的完整指南 在工业控制面板和医疗设备显示屏等专业领域,TFT LCD屏幕凭借其高精度显示和可靠触控性能成为首选方案。不同于消费级产品的通用设计,专业场景下的屏幕需要工程师深入理解从触摸采样…...
从CMIP6到SCI论文:气候降尺度全流程实战(含偏差校正与未来预估)-GCM数据降尺度、泰勒图评估及XGBoost机器学习建模指南
做水文气象、气候学、地理遥感、生态环境等领域的科研人,是不是都逃不过这些噩梦:尺度鸿沟难跨越:GCM 粗网格(>100km)和流域 / 城市精细尺度(<10km)不匹配,动力降尺度成本太高…...
Win11系统升级后如何快速恢复MySQL数据库
1. Win11升级后MySQL恢复的常见场景 最近帮朋友处理了一个典型问题:他的Win11系统升级后,原本运行正常的MySQL服务突然无法启动,项目数据库全部"消失"。这种情况其实很常见——系统升级或重装时,注册表信息、环境变量和…...
Ceph存储集群搭建:如何选择RAID卡模式(HBA vs IT vs non-RAID)
Ceph存储集群搭建:RAID卡模式选择与性能优化实战指南 在构建企业级Ceph存储集群时,硬件配置的每一个细节都可能成为性能瓶颈或稳定性隐患。其中,RAID控制器的工作模式选择——HBA、IT与non-RAID之间的差异,往往被许多初次部署Ceph…...
Magma智能剪辑系统:视频自动生成实战
Magma智能剪辑系统:视频自动生成实战 1. 引言 想象一下这样的场景:你有一个精彩的视频创意,写好了详细的脚本,但面对一堆零散的素材片段却无从下手。传统的视频剪辑需要逐帧挑选、拼接、添加转场,一个几分钟的视频可…...
Fish Speech 1.5开源可部署:模型权重分离存储与热更新机制设计
Fish Speech 1.5开源可部署:模型权重分离存储与热更新机制设计 1. 引言:语音合成的新突破 当你听到一段自然流畅的语音,是否曾想过它可能完全由AI生成?Fish Speech 1.5正是这样一个令人惊叹的技术成果——它能够仅凭10-30秒的参…...
LFM2.5-1.2B-Thinking-GGUF开源生态初探:与Ollama等工具的对比与集成
LFM2.5-1.2B-Thinking-GGUF开源生态初探:与Ollama等工具的对比与集成 1. 开源大模型本地部署生态概览 近年来,开源大模型本地部署工具呈现百花齐放的局面。从早期的单一模型加载器,发展到如今功能丰富的模型管理生态系统,开发者…...
5步释放游戏潜能:面向玩家的原神帧率解锁完全指南
5步释放游戏潜能:面向玩家的原神帧率解锁完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 一、问题发现:为什么你的高端显卡在原神中无法全力奔跑…...
