C++学习之STL学习
在经过前面的简单的C++入门语法的学习后,我们开始接触C++最重要的组成部分之一:STL
目录
STL的介绍
什么是STL
STL的历史
UTF-8编码原理(了解)
UTF-8编码原理
核心编码规则
规则解析
编码步骤示例
1. 确定码点范围
2. 转换为二进制
3. 按格式填充数据位
4. 合并字节序列
UTF-8编码示例表
UTF-8的核心优势
与其他编码的对比
实际应用场景
string类
为什么要学习string类?
标准库中的string类
string类(了解)
auto和范围for
auto关键字
范围for
string类的常用接口说明
string类对象的容量操作
string的遍历
一、[]运算符重载介绍
二、迭代器
三、范围for (C++11)
string类对象的修改操作
string类非成员函数
迭代器的介绍
迭代器的概念与分类
string中迭代器的获取方式
迭代器的基本操作
涉及迭代器的string成员函数
与STL算法结合使用
迭代器失效问题
实际应用示例
迭代器的意义:
一些string类的例题
1.仅仅反转字母
2.查找字符串中第一个唯一的字符
STL的介绍
什么是STL
STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个保罗数据结构和算法的软件框架
STL的历史
C++ STL版本历史发展总览
标准版本 | 发布时间 | 新增组件与特性 | 关键特性与改进 | 影响与意义 |
---|---|---|---|---|
C++98 | 1998 | - 容器:vector , list , deque , set , map - 算法: sort , find , copy - 迭代器、函数对象、适配器 | 首次将STL纳入C++标准,确立泛型编程范式。 | 奠定了现代C++标准库的基础,成为工业级开发的标配。 |
C++03 | 2003 | - 无新增组件 | 技术性修订,修复C++98中的缺陷和模糊定义。 | 提升跨平台一致性,稳定了STL的实现。 |
C++11 | 2011 | - 新容器:unordered_map , unordered_set , array , forward_list - 智能指针: shared_ptr , unique_ptr - 移动语义支持 | - 引入右值引用和移动语义 - 支持Lambda表达式 - 线程安全组件(如 std::thread ) | 现代化STL,显著提升性能和灵活性,推动多核编程。 |
C++14 | 2014 | - 泛型Lambda - std::exchange , std::quoted | 优化C++11特性,增强泛型编程能力。 | 简化代码,提升开发效率。 |
C++17 | 2017 | - std::optional , std::variant , std::string_view - std::filesystem - 并行算法 | - 文件系统标准化 - 并行执行算法(如 std::sort 支持多线程) | 强化实用性和性能,支持现代硬件并行计算。 |
C++20 | 2020 | - 范围库(std::ranges )- 概念(Concepts) - std::span , std::format | - 链式操作简化算法调用(如views::filter )- 约束模板参数,提升编译期类型安全。 | 革命性改进,代码更简洁、安全,支持函数式编程风格。 |
C++23 | 2023 | - std::flat_map , std::flat_set - std::ranges::to - 网络库(提案中) | - 扁平化关联容器优化性能 - 网络编程接口标准化(进行中) | 进一步优化数据结构和算法,扩展应用领域(如网络和嵌入式)。 |
各版本核心改进对比
特性分类 | C++98 | C++11 | C++17 | C++20 |
---|---|---|---|---|
容器 | 基础线性/关联容器 | 哈希容器、固定数组 | 类型安全联合体、文件系统 | 范围视图、span |
算法 | 基础泛型算法 | 支持Lambda和移动语义 | 并行算法、随机抽样 | 范围库链式操作 |
内存管理 | 原始指针 | 智能指针(shared_ptr ) | 内存资源管理(PMR) | 无重大更新 |
并发支持 | 无 | std::thread , std::mutex | 无重大更新 | 无重大更新 |
元编程 | 基础模板 | 类型推导(auto ) | 结构化绑定、if constexpr | 概念(Concepts) |
实用性工具 | 无 | std::function , std::bind | std::optional , std::any | std::format , std::chrono |
关键版本里程碑
-
C++98:STL标准化,泛型编程成为主流。
-
C++11:现代化改造,支持移动语义和多线程。
-
C++17:实用工具扩展,文件系统和并行计算。
-
C++20:范围库和概念,代码简洁性与安全性飞跃。
-
C++23:扁平化容器和网络库,优化高性能场景。
主流STL实现对比
实现名称 | 所属编译器 | 特点 |
---|---|---|
libstdc++ | GCC | 兼容性强,支持旧标准,广泛用于Linux系统。 |
libc++ | Clang/LLVM | 轻量高效,积极支持新标准(如C++20特性)。 |
MSVC STL | MSVC | 深度集成Windows生态,优化调试模式,支持最新C++特性。 |
UTF-8编码原理(了解)
UTF-8编码原理
UTF-8(Unicode Transformation Format-8)是一种可变长度字符编码,用于将Unicode字符映射为字节序列。它兼容ASCII,支持所有Unicode字符(当前最长达21位),且无字节序(Endianness)问题,广泛应用于互联网和跨平台数据交换。
核心编码规则
UTF-8通过1到4个字节表示一个字符,编码规则如下:
Unicode码点范围(十六进制) | UTF-8编码格式(二进制) | 字节数 |
---|---|---|
U+0000 ~ U+007F | 0xxxxxxx | 1字节 |
U+0080 ~ U+07FF | 110xxxxx 10xxxxxx | 2字节 |
U+0800 ~ U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3字节 |
U+10000 ~ U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4字节 |
规则解析
-
首字节前缀:
-
1字节:以
0
开头。 -
2字节:以
110
开头。 -
3字节:以
1110
开头。 -
4字节:以
11110
开头。
-
-
后续字节前缀:所有后续字节均以
10
开头。 -
数据位填充:
x
表示Unicode码点的二进制位,从高位到低位依次填充。
编码步骤示例
以字符 “€”(Unicode码点 U+20AC
)为例,演示UTF-8编码过程:
1. 确定码点范围
-
U+20AC
属于U+0800 ~ U+FFFF
,需 3字节 编码。
2. 转换为二进制
-
十六进制
20AC
→ 二进制0010 0000 1010 1100
(共16位)。
3. 按格式填充数据位
-
3字节模板:
1110xxxx 10xxxxxx 10xxxxxx
。 -
将16位码点拆分填充:
-
首字节:取高4位
0010
→ 填充到1110xxxx
→11100010
。 -
第二字节:取中间6位
000010
→ 填充到10xxxxxx
→10000010
。 -
第三字节:取低6位
101100
→ 填充到10xxxxxx
→10101100
。
-
4. 合并字节序列
-
最终UTF-8编码(十六进制):
E2 82 AC
。
UTF-8编码示例表
字符 | Unicode码点 | UTF-8编码(十六进制) | 二进制格式 |
---|---|---|---|
'A' | U+0041 | 41 | 01000001 |
'ç' | U+00E7 | C3 A7 | 11000011 10100111 |
'中' | U+4E2D | E4 B8 AD | 11100100 10111000 10101101 |
'😂' | U+1F602 | F0 9F 98 82 | 11110000 10011111 10011000 10000010 |
UTF-8的核心优势
-
兼容ASCII:
-
所有ASCII字符(0x00-0x7F)的UTF-8编码与原ASCII编码一致,旧系统可无缝兼容。
-
-
空间高效:
-
常用字符(如拉丁字母、汉字)仅需2-3字节,比UTF-16/UTF-32更节省空间。
-
-
无字节序问题:
-
字节顺序固定(Big-Endian),无需BOM(Byte Order Mark)。
-
-
容错能力强:
-
通过前缀模式可检测编码错误(如无效的后续字节)。
-
与其他编码的对比
编码方式 特点 适用场景 UTF-8 可变长度(1-4字节),兼容ASCII,无字节序问题 网络传输、存储、跨平台 UTF-16 固定2或4字节,存在大端(BE)和小端(LE)问题,需BOM标记 Windows系统、部分旧协议 UTF-32 固定4字节,直接映射码点,空间占用大 内存处理、内部计算
实际应用场景
-
Web开发:
-
HTML、JSON、XML默认使用UTF-8编码,确保多语言支持。
-
-
文件存储:
-
文本文件(如
.txt
、.csv
)优先使用UTF-8,避免乱码。
-
-
数据库:
-
MySQL、PostgreSQL等数据库推荐UTF-8作为字符集。
-
-
编程语言:
-
Python、Java、JavaScript等均原生支持UTF-8字符串处理。
-
-
string类
为什么要学习string类?
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
标准库中的string类
string类(了解)
官方string类的介绍文档:
<string> - C++ 参考
string - C++ 参考
在使用string类的时候,必须要包含头文件<string.h>以及
using namespace std
auto和范围for
auto关键字
早期C/C++中auto的含义是:使用auto修饰的变量是具有自动储存器的局部变量,后来这个不重要了。在C++11 中auto有了全新的含义:auto不再是一个储存类型的指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
用auto声明指针类型时,用auto和auto*没有任何区别,但是用auto声明引用类型时候必须加&,否则只是拷贝而无法通过它去改变指向的值
int main(){int x = 10;auto y = x;auto *z= &x;auto& m = x;cout<<typeid(y).name()<<endl;cout<<typeid(z).name()<<endl;cout<<typeid(m).name()<<endl;return 0;}
这么写也可以
auto p1=&x;
auto* p2=&x;
但是不能这么写
auto *p2=x;
当同一行声明多个变量的时候,这些变量必须是相同类型的,否则编译器会报错。因为编译器实际上只对第一个类型进行推导,然后用推导出来的类型去定义其他变量
auto不能作为函数的参数,可以做返回值,但是建议谨慎使用
#include <iostream>
using namespace std;
int func1()
{return 10;
}
//不能做参数
void func2(auto a)
{}
//可以做返回值但是谨慎使用
auto func3()
{return 10;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = func1();//编译错误:“e”包含类型“auto”必须要有初始值auto e;cout<<typeid(b).name()<<endl;cout<<typeid(c).name()<<endl;cout<<typeid(d).name()<<endl;return 0;
}
auto不能直接声明数组
int main()
{auto aa = 1, bb = 2;//编译错误:声明符列表中,“auto”必须始终推到为同一类型auto cc = 3, dd = 4.0;//编译错误:不能将“auto[]”用作函数参数类型auto arr[] ={4,5,6};return 0;
}
关于 typeid(b).name() 的解析
-
typeid(b)
:
使用typeid
运算符获取变量b
的类型信息,返回一个std::type_info
对象的常量引用。-
作用:在运行时(RTTI,Run-Time Type Information)或编译时获取类型信息。
-
头文件:需包含
<typeinfo>
。
-
-
.name()
:
std::type_info
的成员函数,返回一个表示类型名称的字符串(格式取决于编译器实现)。-
输出示例:
-
GCC/Clang:
i
(表示int
) -
MSVC:
int
-
-
-
cout << ... << endl
:
输出typeid(b).name()
返回的字符串,并换行。
auto真正的应用:
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{std::map<std::string, std::string> dict = { {"apple","苹果"},{"orange","橘子"},{"pear","梨"}};//auto的应用//std::map<std::string, std::string>::iterator it = dict.begin();auto it =dict.begin();while (it != dict.end()){cout<<it->first<<" "<<it->second<<endl;++it;}return 0;
}
范围for
对于有范围的集合而言,程序员说明循环的范围是多余的,有时候还会容易犯错误。因此C++11引入了基于范围的for循环。for循环后括号由冒号“:”分为两部分:第一部分是范围用于迭代的变量,第二部分则表示被迭代的范围,自动迭代自动取数据,自动判断结束
范围for可以作用到数组和容器对象上遍历。
范围for的底层很简单,容器遍历实际上就是替换为迭代器,从汇编也可以看到
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{int arr[] = {1,2,3,4,5};C++98的遍历//for (int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)//{// cout<<arr[i]<<endl;//}//C++11的遍历for (auto& e : arr){e *= 2;}for (auto&e : arr){cout<<e<<" " << endl;}string str("hello world");for (auto ch : str){cout<<ch<<" ";}cout<<endl;return 0;
}
string类的常用接口说明
string的构造方式
他们的特点分别为:
(constructor)函数名称 | 功能说明 |
string(重点) | 构造空的string类,即空字符串 |
string(const char*s)(重点) | 用C-string来构造string类对象 |
string(size_t n,char c) | string类对象包含n个字符c |
string(const string &s)(重点) | 拷贝构造函数 |
一个简单的string程序
#include <iostream>
#include<string>
using namespace std;
void test()
{//最常见的两种string构造方式string s1; //构造空字符串string s2 = "hello world"; //构造常量字符串string s3(s2); //拷贝构造string s4(s2, 1, 5); //从s2中构造子串string s5(s2, 1, 50);string s6(s2, 1);const char* str = "hello world";//常量字符串string s7(str, 5); //从常量字符串构造string s8(100,'#'); //从常量字符串构造cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cout << s5 << endl;cout << s6 << endl;cout << s7 << endl;cout << s8 << endl;
}
int main()
{test();return 0;
}
结果为:
string类对象的容量操作
函数名称 | 功能说明 |
size(重点) | 返回字符串有效字符长度 |
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
empty(重点) | 检测字符串释放为空串,是返回true,否返回false |
clear(重点) | 清空有效字符 |
reserve(重点) | 给字符串预留空间 |
resize(重点) | 讲有效字符的个数改成n个,多出的空间用字符c填充 |
注意:
1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
2. clear()只是将string中有效字符清空,不改变底层空间大小。
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, charc)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
参考文献:string - C++ 参考
以下是一些关键内容的截图:
string的遍历
函数名称 | 功能说明 |
operator[](重点) | 返回pos的位置,const string类对象调用 |
begin+end | begin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器 |
rbegin+rend | begin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器 |
范围for | C++11支持更简洁的范围for新遍历方式 |
一、[]运算符重载介绍
我们很明显地发现:s2是不能修改的
因为它们的调用关系是这样的
void test()
{string s1("hello world");const string s2("hello world");//遍历+修改//下标+[]s1[0]++;/*s2[0]++;*/cout<<s1<<endl;for (size_t i = 0;i < s1.size();i++){s1[i]++;}cout << s1 << endl;
}
int main()
{test();return 0;
}
结果为:
二、迭代器
迭代器是像指针一样的类型对象
void test()
{string s1("hello world");const string s2("hello world");//遍历+修改//下标+[]s1[0]++;/*s2[0]++;*/cout<<s1<<endl;for (size_t i = 0;i < s1.size();i++){s1[i]++;}cout << s1 << endl;//begin() end()返回的是一段迭代器位置的区间,形式是这样的[ )//迭代器//s1--//iterator迭代器//迭代器使用起来像指针string::iterator it = s1.begin(); while (it!= s1.end()){(*it)--;++it;}cout << s1 << endl;}
int main()
{test();return 0;
}
结果为:
迭代器是所有容器的主流迭代方式,迭代器具有迁移性,掌握一个其他的也可以轻松上手
vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator it2 = v.begin();while (it2 != v.end()){cout<<*it2<<" ";++it2;}
三、范围for (C++11)
(这里需要结合前面的auto和范围for的拓展知识内容)
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{int arr[] = {1,2,3,4,5};//C++11的遍历for (auto& e : arr)//从:开始自动,特点是://自动取范围中的数据赋值给e,//自动判断结束//自动迭代{e *= 2;}for (auto&e : arr){cout<<e<<" " << endl;}string str("hello world");for (auto ch : str){cout<<ch<<" ";}cout<<endl;return 0;
}
范围for可以遍历vector,list等其他容器。
范围for本质上底层也会替换为新迭代器,即e=*迭代器
string类对象的修改操作
函数名称 | 功能介绍 |
push back | 在字符串中后尾插字符c |
append | 在字符串后追加一个字符串 |
operator+=(重点) | 在字符串后追加字符串str |
c_str(重点) | 返回C格式字符串 |
find+npos(重点) | 从字符串pos位置开始向后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中位置 |
substr | 在str中从pos位置开始,截取n个字符然后返回 |
注意:
1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
void test()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator it2 = v.begin();while (it2 != v.end()){cout<<*it2<<" ";++it2;}reverse(v.begin(), v.end());}
string类非成员函数
函数 | 功能说明 |
operator+ | 尽量少用,因为传值返回,导致深拷贝效率降低 |
operator>>(重点) | 输入运算符重载 |
operator<<(重点) | 输出运算符重载 |
getline(重点) | 获取一行字符串 |
relation operators(重点) | 大小比较 |
上面的几个接口大家了解一下,下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的操作,这里不一一列举,大家在需要用到时不明白了查文档即可。
迭代器的介绍
迭代器的概念与分类
迭代器是STL中访问容器元素的通用接口,行为类似指针,但抽象程度更高。
-
迭代器类别:
-
正向迭代器(Forward Iterator):单向遍历(如
std::string::iterator
)。 -
双向迭代器(Bidirectional Iterator):支持双向移动(如
std::list::iterator
)。 -
随机访问迭代器(Random Access Iterator):支持跳跃访问(如
std::vector::iterator
)。 -
反向迭代器(Reverse Iterator):逆序遍历容器(如
std::string::reverse_iterator
)。 -
const迭代器:禁止修改元素(如
std::string::const_iterator
)。
-
-
string的迭代器类型:
-
std::string::iterator
:可修改的随机访问迭代器。 -
std::string::const_iterator
:不可修改的随机访问迭代器。 -
std::string::reverse_iterator
:可修改的反向迭代器。 -
std::string::const_reverse_iterator
:不可修改的反向迭代器。
-
string中迭代器的获取方式
通过成员函数获取不同类别的迭代器:
正向迭代器:
std::string str = "Hello";
auto begin = str.begin(); // 指向第一个字符的迭代器
auto end = str.end(); // 指向末尾(最后一个字符的下一位)
反向迭代器:
auto rbegin = str.rbegin(); // 指向最后一个字符的反向迭代器
auto rend = str.rend(); // 指向头部前一位的反向迭代器
const迭代器:
auto cbegin = str.cbegin(); // 常量正向迭代器
auto crbegin = str.crbegin(); // 常量反向迭代器
迭代器的基本操作
遍历字符串:
for (auto it = str.begin(); it != str.end(); ++it) {std::cout << *it; // 解引用访问字符
}
反向遍历:
for (auto rit = str.rbegin(); rit != str.rend(); ++rit) {std::cout << *rit; // 输出逆序字符
}
随机访问:
auto it = str.begin() + 3; // 跳转到第4个字符('l')
std::cout << *it; // 输出 'l'
涉及迭代器的string成员函数
构造与赋值:
std::string s4(str.begin(), str.begin() + 3); // 构造子串 "Hel"
str.assign(s4.rbegin(), s4.rend()); // 赋值逆序子串 "leH"
插入与删除:
str.insert(str.begin() + 2, 'X'); // 在位置2插入'X' → "HeXllo"
str.erase(str.begin() + 1); // 删除位置1的字符 → "HXllo"
查找与替换:
auto pos = std::find(str.begin(), str.end(), 'X');
if (pos != str.end()) {*pos = 'Y'; // 替换找到的字符
}
与STL算法结合使用
利用标准算法处理字符串:
排序字符串字符:
std::sort(str.begin(), str.end()); // 升序排列字符
统计字符出现次数:
int count = std::count(str.begin(), str.end(), 'l');
条件查找:
auto it = std::find_if(str.begin(), str.end(), [](char c) {return c >= 'A' && c <= 'Z';
});
迭代器失效问题
-
导致失效的操作:
-
修改字符串长度(如
append()
,insert()
,erase()
)。 -
重新分配内存(如
reserve()
不足时扩容)。
-
-
安全实践:
-
在修改操作后,避免使用旧的迭代器。
-
使用索引或重新获取迭代器。
-
实际应用示例
逆序输出字符串:
for (auto rit = str.rbegin(); rit != str.rend(); ++rit) {std::cout << *rit;
}
删除所有空格:
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
转换为大写:
std::transform(str.begin(), str.end(), str.begin(), ::toupper);
迭代器的意义:
1.统一类似的方式遍历修改容器
2.算法脱离了具体的底层结构,与底层结构解耦(降低耦合,降低关联关系)
算法独立模板实现,针对多个容器处理
下图就是相关的代码示例:(使用前要包含头文件<algorithm>)
一些string类的例题
1.仅仅反转字母
题目:
这道题本质上是类似于快速排序算法
这道题不适合用范围for,也不适合迭代器。用下标法求解这道题:
class Solution
{
public:string reverseOnlyLetters(string s) {if(s.empty())return s;size_t begin=0,end=s.size()-1;while(begin<end){while(begin<end&&!isalpha(s[begin])){++begin;}while(begin<end&&!isalpha(s[end])){--end;}swap(s[begin],s[end]);++begin;--end;}return s;}
};
或者
class Solution
{
public:bool isletter(char ch){if(ch>='a'&&ch<='z'){return true;}else if(ch>='A'&&ch<='Z'){return true;}else {return false;}}string reverseOnlyLetters(string s) {if(s.empty())return s;size_t begin=0,end=s.size()-1;while(begin<end){while(begin<end&&!isletter(s[begin])){++begin;}while(begin<end&&!isletter(s[end])){--end;}swap(s[begin],s[end]);++begin;--end;}return s;}
};
2.查找字符串中第一个唯一的字符
题目:
思路:哈希
哈希就是映射,即建立数字与位置的映射,就像下图这样
class Solution
{
public:int firstUniqChar(string s) {int count[26]={0};//每个字符出现的次数for(auto e:s){count[e-'a']++;}for(size_t i=0;i<s.size();++i){if(count[s[i]-'a']==1){return i;}}return -1;}
};
本期博客就到这里了,string的内容还没有结束,后续我们会进一步了解string的应用
相关文章:
C++学习之STL学习
在经过前面的简单的C入门语法的学习后,我们开始接触C最重要的组成部分之一:STL 目录 STL的介绍 什么是STL STL的历史 UTF-8编码原理(了解) UTF-8编码原理 核心编码规则 规则解析 编码步骤示例 1. 确定码点范围 2. 转换为…...
【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发
文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包,旨在加速 Nvidia GPU 上的计算密…...
LangChain对话链:打造智能多轮对话机器人
LangChain对话链:打造智能多轮对话机器人 目录 LangChain对话链:打造智能多轮对话机器人ConversationChain 是什么核心功能与特点基本用法示例内存机制自定义提示词应用场景与其他链的结合`SequentialChain` 是什么 硬件组成: NodeMC…...
HTML12:文本框和单选框
表单元素格式 属性说明type指定元素的类型。text、password、 checkbox、 radio、submit、reset、file、hidden、image 和button,默认为textname指定表单元素的名称value元素的初始值。type为radio时必须指定一个值size指定表单元素的初始宽度。当type为text 或pas…...
JVM规范之运行时数据区域
JVM运行时数据区 前言为什么要阅读jvm规范?阅读本篇文章可以学习到啥? 正文概述JVM线程私有的运行时数据区pc(program counter) RegisterJVM StackNative Method Stack JVM线程共享的运行时数据区HeapMethod AreaRun-time constant pool 总结参考链接 前…...
LVGL(lv_btnmatrix矩阵按钮)
文章目录 🔧 1. 基本概念📌 lv\_btnmatrix 是什么? 🧱 2. 基本结构和用法✅ 创建按钮矩阵✅ 设置按钮文字 🧰 3. 设置按钮行为🔄 4. 响应按钮点击🎨 5. 自定义样式📌 6. 使用技巧&am…...
AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue
AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR(AUTomotive Open Sy…...
英语时态--中英文对“时间”的不同理解
文章目录 中英文时间上的差异我现在正在休息一般现在时1. 经常发生的动作2. 表客观事实3. 表示现在的状态一般将来时1. will2. be going to含义1:打算在将来某时做某事含义2:某事预计要发生而且不可避免中英文时间上的差异 我现在正在休息 “我现在正在休息。”用英文怎么说…...
Linux基础开发工具一(yum/apt ,vim)
前言 Linux下,如何进行软件安装,查找,卸载 1.源代码安装 2. rpm安装方式,安装包的本质,就是把源代码在Linux下编译好,然后打包(别人把自己编译好的软件打包给你让你去安装) 上面…...
Java 线程池原理
Java 线程池是一种管理和复用线程的机制,其原理如下: 核心概念 线程池的初始化 :在创建线程池时,需要设置一些关键参数,如核心线程数(corePoolSize)、最大线程数(maximumPoolSize&am…...
AJAX 使用 和 HTTP
ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML: 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用?表示之后的参数…...
mem0跟Memgraph交互
目录 1. 安装和设置2. 配置连接3. 使用 mem0 进行交互4. 添加和查询数据5. 代码运行结果 1. 安装和设置 首先,确保你已经安装了 Memgraph 和 mem0 库。你可以使用 pip 来安装 mem0: uv pip install "mem0ai[graph]" uv pip install langchai…...
httpclient请求出现403
问题 httpclient请求对方服务器报403,用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因: 因为没有设置为浏览器形式&#…...
验证码与登录过程逻辑学习总结
目录 前言 一、验证码与登录 二、使用步骤 1.先apipost测试一波 2.先搞验证码 3.跨域问题 4.后端走起 总结 前言 近期要做一个比较完整的demo,需要自己做一个前端登录页面,不过api接口都是现成的,一开始以为过程会很easy,…...
openai接口参数max_tokens改名max-completion-tokens?
文章目录 关于max_tokens参数max_tokens改max-completion-tokens?控制 OpenAI 模型响应的长度 关于max_tokens参数 大模型 API(比如 OpenAI、DeepSeek、Moonshot 等)都是按照“Token 数量”来计费。 控制内容:控制一次请求返回的…...
【办公类-39-07】20250511批量生成通义万相图片(七)彩色背景蝴蝶-筛选无黑无白的图片
制作了教师裁剪的拼图块后,发现如果图案上有黑色,就没法看清出凹凸角,剪起来有误差 所以黑色也要剔除 通义万相下载的彩色蝴蝶有彩色背景的图片,放弃有白色和黑色图案的图片,保留彩色图案的蝴蝶 deepseek、阿夏 20250…...
容器技术 20 年:颠覆、重构与重塑软件世界的力量
目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重,到操作系统虚拟…...
Docker 部署 - Crawl4AI 文档 (v0.5.x)
Docker 部署 - Crawl4AI 文档 (v0.5.x) 快速入门 🚀 拉取并运行基础版本: # 不带安全性的基本运行 docker pull unclecode/crawl4ai:basic docker run -p 11235:11235 unclecode/crawl4ai:basic# 带有 API 安全性启用的运行 docker run -p 11235:1123…...
在C++中,符号位是否参与位运算
在C中,符号位是否参与位运算取决于具体的运算符和数据类型。以下是详细解释: 1. 按位与(&)、按位或(|)、按位异或(^) 规则:这些运算符会处理包括符号位在内的所有二…...
【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:以太网、MAC地址、MTU与ARP协议 下篇文章:五种IO模型与阻…...
redis数据结构-08(SINTER、SUNION、SDIFF、SISMEMBER)
集合运算:SINTER、SUNION、SDIFF、SISMEMBER Redis 集合是一种功能强大的数据结构,可用于存储一组唯一元素。本课基于上一课对 Redis 集合的介绍,深入探讨了使 Redis 集合如此多功能的基本集合操作: SINTER 、 SUNION 、 SDIFF 和…...
大模型都有哪些超参数
大模型的超参数是影响其训练效果、性能和泛化能力的关键设置,可分为以下几大类别并结合实际应用进行详细说明: 一、训练过程相关超参数 学习率(Learning Rate) 作用:控制参数更新的步长,直接影响收敛速度和稳定性。过高会导致震荡或过拟合,过低则收敛缓慢。调整策略:初…...
【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计)
【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计) 1、时间:1999-2023年 2、来源:上市公司年报 3、指标:股票代码、公司简称、年报标题、年份、行业名称、行业代码、全文-文本总长度、仅中英…...
通过 Azure DevOps 探索 Helm 和 Azure AKS
俗话说:“慷慨之人必昌盛;滋润他人者,必得滋润。” 如果您觉得这篇文章对您有有所帮助,请点赞,关注,转发! 前言 在不断发展的云计算世界中,应用程序的无缝部署和管理至关重要。Azu…...
Go语言标识符
文章目录 标识符的组成规则Go语言关键字预定义标识符标识符命名惯例 特殊标识符标识符访问权限控制 在Go语言中,标识符(Identifier)是用来命名变量、函数、类型、常量等程序实体的名称。 标识符的组成规则 1、必须以字母或下划线(_)开头: 字母包括Unico…...
Spring Cloud : OpenFeign(远程调用)
RestTemplate虽然比直接用HTTPClient简单的多,但是还是存在着许多的问题,比如url拼接麻烦,容易出错,并且可读性很差 public OrderDetail selectOrderById(Integer orderId){OrderDetail orderDetail orderMapper.selectOrderById…...
JVM内存结构有哪些?HashMap和HashTable的区别?
JVM内存结构 JVM内存主要分为以下几个区域: 程序计数器(Program Counter Register) 线程私有,记录当前线程执行的字节码行号指示器 唯一一个不会出现OOM的内存区域 Java虚拟机栈(Java Virtual Machine Stacks) 线程私有,生命周期与线程相…...
三维空间中的组织行为映射:MATLAB 数据插值可视化技术
在组织行为学研究中,如何直观呈现多维变量之间的关系一直是个挑战。今天我们将深入解析一段 MATLAB 代码,看看如何通过数据插值和三维可视化技术,将抽象的组织行为数据转化为直观的三维曲面图,揭示组织自尊 (OBSE)、牺牲性领导 (SSL) 与责任感知 (FO) 之间的复杂关系。 �…...
ImportError: DLL load failed: 找不到指定的程序。
查看其他博客说是缺少libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 然后去下载放到博客说的目录下 没有用 解决不了一点 OpenSSL for Windows 64位 完整安装包 在这里 项目地址: https://gitcode.com/open-source-toolkit/eb627 注意事项 此安装包仅适用于64位Windows系…...
计算机的三个根本性基础
1. 计算机是执行输入、运算、输出的机器 从硬件上看,计算机是执行输入、运算、输出的机器,计算机的硬件由大量的IC(Integrated Circuit,集成电路)组成。 IC会在其中内部对外部输入的信息进行运算,并把运算…...
C++ Builder XE 使用DevMode设置打印机的自定义纸张,打印方向
代码功能介绍(以备以后查询):该代码片段展示了如何将TPanel控件的内容作为图像打印出来。首先,代码创建了一个与TPanel大小相同的位图,并通过BitBlt函数将TPanel的内容复制到位图中。接着,代码配置打印机,设…...
QOwnNotes:功能强大的跨平台笔记应用程序
QOwnNotes是一款功能强大的跨平台笔记应用程序,专为追求高效、灵活笔记管理的用户设计。它不仅支持Windows、macOS和Linux等多种操作系统,还提供了丰富的功能,帮助用户轻松管理笔记、任务和清单。无论是日常记录、学习笔记还是工作计划&#…...
深入理解反序列化攻击:原理、示例与利用工具实战
反序列化漏洞是现代 Web 安全中的一个高危攻击类型,常常导致远程代码执行(RCE)、文件读写、身份伪造等严重后果。本文将从基础原理讲起,结合实际代码和工具(PHPGGC、ysoserial)演示反序列化攻击的完整过程。…...
【今日三题】素数回文(模拟) / 活动安排(区间贪心) / 合唱团(动态规划)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 素数回文(模拟)活动安排(区间贪心)合唱团(动态规划) 素数回文(模拟) 素数回文 #include <iostream> #include <st…...
一文了解B+树的删除原理
1. B树的核心特性回顾 B树是一种广泛应用于数据库和文件系统的平衡多路搜索树,其核心特性包括: 阶数(m):定义每个节点最多拥有的子节点数(或键数)节点容量规则: 根节点:…...
Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)
下载地址: 前端:https://download.csdn.net/download/2401_83418369/90811402 后端:https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...
26考研——中央处理器_指令流水线_指令流水线的基本概念 流水线的基本实现(5)
408答疑 文章目录 六、指令流水线指令流水线的基本概念流水线的基本实现流水线设计的原则流水线的逻辑结构流水线的时空图表示 八、参考资料鲍鱼科技课件26王道考研书 六、指令流水线 前面介绍的指令都是在单周期处理机中采用串行方法执行的,同一时刻 CPU 中只有一…...
DAY 22 复习日kaggle泰坦里克号人员生还预测
复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 输入: import pandas as pd from sklea…...
SpringCloud Gateway知识点整理和全局过滤器实现
predicate(断言): 判断uri是否符合规则 • 最常用的的就是PathPredicate,以下列子就是只有url中有user前缀的才能被gateway识别,否则它不会进行路由转发 routes:- id: ***# uri: lb://starry-sky-upmsuri: http://localhost:9003/predicate…...
婴幼儿托育实训室师资协同培养模式
随着社会对婴幼儿托育服务需求的日益增长,培养适应市场需求的高素质托育人才成为当务之急。产教融合作为一种有效的人才培养模式,对于婴幼儿托育实训室建设具有重要意义,能够有效整合学校和企业的资源,为婴幼儿托育实训室人才培养…...
Gartner 《2025大数据管理规划指南》学习心得
概要 本研究旨在为数据和分析(D&A)技术专业人员提供2025年的数据管理规划指导,帮助他们应对最新数据管理趋势,以增强决策制定并实现卓越的业务成果。强调了持续适应数据管理实践的组织将更有能力做好人工智能(AI&…...
理解反向Shell:隐藏在合法流量中的威胁
引言 在网络安全领域,反向Shell(Reverse Shell) 是一种隐蔽且危险的攻击技术,常被渗透测试人员和攻击者用于绕过防火墙限制,获取对目标设备的远程控制权限。与传统的“正向Shell”(攻击者主动连接…...
《AI大模型应知应会100篇》第55篇:大模型本地开发环境搭建
第55篇:大模型本地开发环境搭建 ——从零开始构建你的AI炼金炉 📌 摘要 在人工智能尤其是大模型(LLM)领域,一个高效、稳定、可扩展的本地开发环境是每位开发者的第一块基石。本文将手把手带你完成从硬件选型到软件配…...
AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月11日第74弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀6-8个和值,可以做到100-300注左右。 (1)定…...