C++初阶-string类2
目录
1.迭代器
1.1普通迭代器的使用
1.2string::begin
1.3string::end
1.4const迭代器的使用
1.5泛型迭代器和const反向迭代器
1.6string::rbegin
1.6string::rend
1.7string::cbegin、string::cend、string::crbegin、string::crend
与begin/end、rbegin/rend的区别
2.Capacity
2.1string::size
2.2string::length
2.3string::max_size
2.3.1max_size()的返回值含义
2.3.2典型返回值
2.3.3重要特性
2.3.4使用示例
2.3.5实际应用场景
2.3.6注意事项
2.4string::clear
2.5string::empty
2.7string::shrink_to_fit
2.8string::capacity
2.9string::reserve
2.10string::resize
示例代码
重要注意事项
3. 总结
1.迭代器
迭代器在string中用的不多,所以在这里我只是简单讲解一下。这是迭代器的全部成员函数,但是在这之前我们需要先了解一部分迭代器的基本用法,迭代器之后会详细讲解。
1.1普通迭代器的使用
迭代器是定义在类域里面的,所以我们需要指定类域(string类里面的)。在类域里面定义有两种情况需要指定类域:内部类和在类域里面typedef(之后会讲)。相当于这个iterator这个类封装在这个类里面了,iterator是类型,叫做迭代器。
#include<iostream>
using namespace std;
#include<string>
int main()
{string s2("hello world");//返回第一个位置的迭代器string::iterator it = s2.begin();//it的打印cout << *it << endl;return 0;
}
我们这个阶段可以把迭代器视为一个指针,但是又与指针有区别的东西(解引用的时候可以访问到它)。
1.2string::begin
这个函数有俩个重载:
返回的是第一个位置的迭代器,所以上面程序的结果为:
1.3string::end
在这个成员函数定义中也是有两个重载函数,我们暂时只要知道普通对象的使用就可以了:
这个end函数的功能我们发现还是比较长的,我们用翻译软件来翻译一下:
返回值这个东西是我们需要注意的,因为返回的并不是最后一个字符的迭代器,而是最后一个字符的后面一个位置,所以我们不能让它在遍历时到达it.end()位置!
我们可以把begin-end这一部分视为数学里面的左闭右开的方式,也就是说,如果最后一个字符的下标是4,那么end就指向的是下标为5的位置。其使用方式如下:
#include<iostream>
using namespace std;
#include<string>
int main()
{string s2("hello world");//返回第一个位置的迭代器string::iterator it = s2.begin();while (it != s2.end()){cout << *it << " ";++it;}cout << endl;return 0;
}
运行结果如下:
我们可以发现:这种方式也可以遍历string对象,虽然我们之前用下标+[]的形式更方便,但是它只适用于用数组实现的数据结构,而迭代器却能适用于各种数据结构!
如:用迭代器向链表中插入5个数据
#include<iostream>
using namespace std;
#include<string>
#include<list>
//用迭代器向链表中插入5个数据
int main()
{list<int> lt1 = { 1,2,3,4,5 };list<int>::iterator it1 = lt1.begin();while (it1 != lt1.end()){cout << *it1 << " ";++it1;}cout << endl;return 0;
}
则运行结果如下:
可见,迭代器在数据结构和其他的东西用法还是比较广泛的!
其次我们不能在迭代器中的结束条件改为:it1<s2.end();因为它是链表,不是线性的,不是连续存放在堆(动态开辟)上面的,所以不能这样写!
1.4const迭代器的使用
#include<iostream>
using namespace std;
#include<string>
int main()
{string s5("hello CSDN");string::const_iterator it3 = s5.begin();//const迭代器const string s4("hello world");//会报错string::iterator it1 = s4.begin();//正确的使用方式string::const_iterator it2 = s4.begin();return 0;
}
这个const迭代器可以用普通的string对象来定义,也可以用const的string对象来定义,因为前者是权限缩小,是可以的;而后者是权限放大时不行的,所以会:
且不是在string::iterator it1前加const,因为这代表it1不可修改,而不是代表it1指向的对象不可修改。
当然,我们可以用之前学过的知识:auto关键字,直接用auto it5=s4.begin();也可以,只是你一定要知道这个it5的类型是不能修改的迭代器!
1.5泛型迭代器和const反向迭代器
当然,迭代器还有反向迭代器和const反向迭代器。如果想倒着遍历就可以用它。其他的和普通迭代器与const迭代器差别不大:
#include<iostream>
using namespace std;
#include<string>
int main()
{string s2("hello world");const string s3("hello 5·1");//可读可写string::reverse_iterator rit = s2.rbegin();while (rit != s2.rend()){(*rit)++;cout << *rit << " ";++rit;}cout << endl;//只可读string::const_reverse_iterator rit1 = s3.rbegin();while (rit1 != s3.rend()){//报错//(*rit1)++;cout << *rit1 << " ";++rit1;}cout << endl;return 0;
}
运行结果如下:
1.6string::rbegin
这个成员函数只能适用于反向迭代器,所以其重载成员函数:
翻译成中文为:
所以这个成员函数若用rbegin则返回的是最后一个字符,而且++是往前遍历,并不是往后遍历,所以会出现之前的情况。
1.6string::rend
这个和end功能刚好相反,且是以反向迭代器作为返回值。
其翻译如下:
rend指向的是第一个元素前面一个位置,其注意点差不多。
反向迭代器一定不是指针,因为指针++不可能做到往后走,故必须有运算符重载的函数,且是有一个类封装的指针。
1.7string::cbegin、string::cend、string::crbegin、string::crend
这些在string中用得真得不是很多,所以我在这里只截图这些函数的声明和这些成员函数的用法(翻译)。
以下是deepseek的搜索结果:
C++ string类的cbegin、cend、crbegin、crend用法
这些是C++ string类提供的迭代器相关成员函数,用于以不同方式遍历字符串。它们都是C++11引入的const迭代器版本,确保不会通过迭代器修改字符串内容。
1. cbegin() 和 cend()
- cbegin(): 返回指向字符串第一个字符的const迭代器
- cend(): 返回指向字符串末尾(最后一个字符后面)的const迭代器
#include <iostream>
#include <string>int main()
{std::string str = "World";// 反向遍历for (auto it = str.crbegin(); it != str.crend(); ++it) {std::cout << *it << " "; // 可以读取但不能修改// *it = 'a'; // 错误!不能修改}// 输出: d l r o W
}
2. crbegin() 和 crend()
- crbegin(): 返回指向字符串最后一个字符的const反向迭代器
- crend(): 返回指向字符串开头(第一个字符前面)的const反向迭代器
#include <iostream>
#include <string>int main() {std::string str = "World";// 反向遍历for (auto it = str.crbegin(); it != str.crend(); ++it) {std::cout << *it << " "; // 可以读取但不能修改// *it = 'a'; // 错误!不能修改}// 输出: d l r o W
}
与begin/end、rbegin/rend的区别
-
cbegin/cend
是begin/end
的const版本 -
crbegin/crend
是rbegin/rend
的const版本 -
非const版本允许修改字符串内容,而const版本不允许
-
std::string str = "Example";auto it1 = str.begin(); // 可读写迭代器 *it1 = 'e'; // 允许修改auto it2 = str.cbegin(); // 只读迭代器 // *it2 = 'E'; // 编译错误
使用场景
1. 当需要遍历字符串但不修改内容时
2. 在const成员函数中访问字符串内容
3. 需要明确表达不修改字符串意图的代码中
这些const迭代器提供了更好的代码安全性和表达性,特别是在团队开发或大型项目中。
这些用得不多,所以我们只要了解一下即可。
2.Capacity
这个单词的意思是:容量。而在这个分类中包含了以下函数:
2.1string::size
这个函数的作用是:
如果我们存储的是char类型的变量,可以视为能返回所存储的数据个数,但实际上不包含\0,而我们一般又把\0要加进去,所以我们一般返回的是不包含\0的数据个数。所以之后可能需要加1来保证所存储的数据个数准确。
2.2string::length
我们可以看到虽然length和size返回的是一样的,除了函数名不相同,其余的都是相同的,难道是我们可以用size和length都来计算这个string对象的长度?
本质上,size和length都是返回的字符个数(字符串)。我们要了解其区别,就要看Deepseek给的答案了(适当用AI是没有问题的):
C++ string类中size()和length()的区别
在C++的`std::string`类中,`size()`和`length()`这两个成员函数**功能完全相同**,它们都返回字符串中字符的个数(不包括结尾的空字符'\0')。
相同点
1. 两者都返回字符串的字符数量
2. 两者时间复杂度都是O(1)(常数时间)
3. 两者都不计算结尾的空字符'\0'
4. 两者都可以用于空字符串(返回0)
std::string str = "Hello";
std::cout << str.size(); // 输出5
std::cout << str.length(); // 输出5
为什么有两个功能相同的函数?
1. 历史原因:
- `length()`来自于早期的字符串概念,更符合自然语言描述
- `size()`是为了与STL容器(如vector、list等)保持一致性,因为所有STL容器都有size()方法
2. 设计理念:
- `length()`强调"字符串长度"的概念
- `size()`强调"容器大小"的概念
使用建议
1. 在字符串上下文中,使用`length()`可能更直观
2. 在泛型编程或模板代码中,使用`size()`可以保持与其他容器的一致性
3. 两者性能完全相同,选择哪个纯粹是风格问题
// 字符串专用代码
if (str.length() > 10) { /*...*/ }// 泛型代码
template <typename T>
void printSize(const T& container)
{std::cout << container.size(); // 对string和vector等都适用
}
总结
`size()`和`length()`在功能上没有区别,选择使用哪个主要取决于:
- 代码上下文(是否强调字符串特性)
- 个人或团队的编码风格
- 需要与其他STL容器保持一致的场景
其实一般我们要使用的是size()因为有些数据结构上是没有length函数的,所以我们使用size也是方便我们之后使用的,因为如果链式结构我们用length的话就确实不怎么好,因为length的意思是长度,链式结构存储地址是不一样的,所以我们用这个确实也不准确。所以我的建议是用size()而不是length()。
2.3string::max_size
这就相当于数据结构中特别的capacity概念,就是动态开辟的空间个数,限定了我们的最大能存储的数据个数,但是同样,它返回值是少了'\0'后的容量,可以视为返回的是容量-1,假设size==capacity,即开辟的所有空间都存储数据的情况下,则返回的是最大的下标。
#include<iostream>
using namespace std;
#include<string>
int main()
{string s2("I love you China");//size()的使用cout << s2.size() << endl;//length()的使用cout << s2.length() << endl;//max_size()的使用cout << s2.max_size() << endl;return 0;
}
运行结果为:
max_size()
是C++ std::string
类的一个成员函数,它返回该string对象在当前系统环境下理论上能够容纳的最大字符数量。
2.3.1max_size()的返回值含义
-
理论最大值:返回string在当前系统实现下能够表示的最大可能大小
-
实现定义:具体值取决于C++标准库的实现和系统环境
-
不是可用内存:不代表实际可用内存,只是理论限制
2.3.2典型返回值
-
在64位系统上,通常返回一个非常大的数,如:
-
GNU libstdc++: 通常是
2^64 / sizeof(char) - 1
(约1.8×10¹⁹) -
Microsoft Visual C++: 通常是
2^64 - 1
(约1.8×10¹⁹)
-
2.3.3重要特性
-
不是分配保证:即使max_size()返回很大的值,实际能分配的字符串受限于可用内存
-
与capacity()区别:
-
capacity()
:当前已分配的内存能容纳的字符数 -
max_size()
:理论上的最大可能值
-
-
平台依赖性:不同平台、不同编译器实现可能返回不同值
2.3.4使用示例
#include <iostream>
#include <string>int main() {std::string str;std::cout << "Max size: " << str.max_size() << std::endl;// 通常输出类似(64位系统):// Max size: 9223372036854775807 或 18446744073709551615
}
2.3.5实际应用场景
-
边界检查:在需要处理极大字符串时进行理论限制检查
-
异常处理:在分配大内存前检查是否超过理论限制
-
调试信息:了解当前平台的字符串理论限制
2.3.6注意事项
-
尝试分配接近max_size()大小的字符串通常会抛出
std::bad_alloc
异常 -
实际可用大小远小于max_size(),受限于物理内存和系统限制
-
这个值主要用于理论上的完整性检查,而非实际内存分配指导
在大多数实际应用中,你不需要关心max_size(),除非你在处理极端情况下的字符串大小问题。
以上是max_size()比较详细的介绍,我们只要了解一下就可以了。
2.4string::clear
这个函数只是清除字符串中的所有数据,而不释放空间。并且还会让size=0(成员变量),capacity一般不清理。
2.5string::empty
2.7string::shrink_to_fit
缩容,对capacity进行缩小,缩小容量至size。我们一般用这个函数来实现以空间换时间的情况,因为我们多释放一部分空间,使capacity也缩小,不用遍历那么多次了。
但是这个缩容不是在原地址上进行释放空间,它会先在其他地方申请size个空间,再把内容拷贝过去,最后再释放原空间,这是异地缩容,它的效率比较低,异地扩容代价很大,所以尽量别使用这个函数,除非你想用空间来换时间,因为空间是很大的。
2.8string::capacity
这个函数是返回不包括\0后的空间大小,所以会返回的比实际大小小1,一般用来计算能存储数据个数大小。
2.9string::reserve
reserve翻译过来有保留的意思,注意:reverse是反转、逆置的意思。这两个单词不要区分不清楚了!reserve就是把它的capacity改变到n个字符去,而且是按计划来的。
#include<iostream>
using namespace std;
#include<string>
int main()
{string s("Hello world");string a("Hello world");string b("Hello world");string c("Hello world");cout << s.capacity() << endl;a.reserve(10);cout << "改变为10后的结果为 " << a.capacity() << endl;b.reserve(15);cout << "改变为15后的结果为 " << b.capacity() << endl;c.reserve(20);cout << "改变为20后的结果为 " << c.capacity() << endl;return 0;
}
运行结果为:
我们发现如果在给的数值小于size个的时候,就不会缩容,而必定会扩容,我们若这样写:
#include<iostream>
using namespace std;
#include<string>
int main()
{string s("Hello world");string a("Hello world");cout << s.capacity() << endl;cout << s.size() << endl;a.reserve(12);cout << "改变为12后的结果为 " << a.capacity() << endl;return 0;
}
则运行结果为:
所以这和我们的shrink_to_fit函数是有区别的,一般我们都用这个函数来扩容。
reserve的作用:减少扩容,如我们知道开始就知道要插入1000个字符,那么我们直接:s.reserve(1000),这样我们就不用频繁扩容了,这样减少扩容,提高了效率,若不够会继续扩容的。
2.10string::resize
这个函数用得不是很多,所以现在我不会讲很多,主要是用deepseek的结果来讲解:
-
当n < 当前size:
-
截断字符串,保留前n个字符
-
capacity保持不变
-
不释放内存
-
-
当n > 当前size:
-
扩展字符串长度
-
可能需要重新分配内存(如果n > capacity)
-
单参数版本用空字符('\0')填充新增部分
-
双参数版本用指定字符c填充新增部分
-
-
当n == 当前size:
-
不做任何改变
-
示例代码
#include <iostream>
#include <string>int main() {std::string str = "Hello";// 截断字符串str.resize(3);std::cout << str << std::endl; // 输出: Hel// 扩展字符串(默认填充'\0')str.resize(6);std::cout << "After resize(6): [" << str << "]" << std::endl;// 扩展字符串并用特定字符填充str.resize(10, 'X');std::cout << "After resize(10, 'X'): " << str << std::endl;// 输出: HelXXX XXXX (注意之前有隐含的'\0')
}
重要注意事项
-
内存分配:
-
如果新size超过当前capacity,会触发内存重新分配
-
内存分配可能导致迭代器、指针和引用失效
-
-
性能考虑:
-
频繁resize可能导致多次内存分配
-
可以先reserve()预留足够空间再resize()
-
实际应用场景
-
预先分配并填充缓冲区:
std::string buffer; buffer.resize(1024, '\0'); // 分配1KB空间并清零
-
动态调整字符串大小:
std::string data = getData(); data.resize(data.find_first_of('\0')); // 截断到第一个null字符
-
格式化输出准备:
std::string line(50, '-'); line.resize(30); // 缩短线长度
这个函数需要我们了解的真的不多,所以我就不怎么讲解了。
3. 总结
这节课主要是讲了迭代器和capacity的知识,下节将讲解:
以及一些扩容的额外的知识,所以一定要不能缺这些内容啊,因为下节的博客需要讲解的是string的增删查改的一部分内容,喜欢的可以一键三连哦!提前祝各位五一劳动节快乐啊!
相关文章:
C++初阶-string类2
目录 1.迭代器 1.1普通迭代器的使用 1.2string::begin 1.3string::end 1.4const迭代器的使用 1.5泛型迭代器和const反向迭代器 1.6string::rbegin 1.6string::rend 1.7string::cbegin、string::cend、string::crbegin、string::crend 与begin/end、rbegin/rend的区别 …...
Qt QComboBox 下拉复选多选(multicombobox)
Qt QComboBox 下拉复选多选(multicombobox),备忘,待更多测试 【免费】QtQComboBox下拉复选多选(multicombobox)资源-CSDN文库...
逻辑回归之参数选择:从理论到实践
在机器学习的广阔领域中,逻辑回归作为一种经典的有监督学习算法,常用于解决分类问题。它以其简单易懂的原理和高效的计算性能,在实际应用中备受青睐。然而,要充分发挥逻辑回归的优势,参数选择是关键环节。本文将结合信…...
10、属性和数据处理---c++17
一、[[fallthrought]] 用途:在 switch 语句中标记某个分支 (case) 故意不写 break,明确告知编译器“执行穿透”是有意为之。 仅在需要向下穿透时使用,且应添加注释说明原因 #include<cstdio> #include<iostream> using namesp…...
conda管理python环境
安装conda 使用anaconda官网安装地址:https://www.anaconda.com/download/success 配置镜像环境 conda config --add channels Index of /anaconda/pkgs/main/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror conda config --add channels Index of /an…...
【Python学习路线】零基础到项目实战系统
目录 🌟 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 🧠 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 💻 二、实战演示环境配置要求核心代码实现运行结果验证 ⚡ 三、性能对比测试方法论量化数据对比…...
C/C++核心机制深度解析:指针、结构体与动态内存管理(面试精要)
C/C核心机制深度解析:指针、结构体与动态内存管理(面试精要) 引言 在系统级编程领域,C/C语言凭借对硬件的直接操作能力和高效的内存管理机制,长期占据主导地位。面试中,指针、结构体和动态内存管理作为三…...
宇树科技举办“人型机器人格斗大赛”
2025 年 5 月至 6 月,一场全球瞩目的科技盛宴 —— 全球首场 “人形机器人格斗大赛”,将由杭州宇树科技盛大举办。届时,观众将迎来机器人格斗领域前所未有的视觉震撼。 为打造最强参赛阵容,宇树科技技术团队在过去数周里…...
getattr 的作用
getattr 是 Python 内置的一个函数,用于“动态地”获取对象的属性。**它允许你在运行时通过属性名称(字符串形式)来访问对象的属性,而不用在代码中直接硬编码属性名。**下面详细介绍该方法的用法和注意事项: ────…...
腾讯云服务器性能提升全栈指南(2025版)
腾讯云服务器性能提升全栈指南(2025版) 一、硬件选型与资源优化 1. 实例规格精准匹配 腾讯云服务器提供计算型CVM、内存型MEM、大数据型Hadoop等12种实例类型。根据业务特性选择: • 高并发Web应用:推荐SA3实例࿰…...
Kotlin与Jetpack Compose的详细使用指南
Kotlin与Jetpack Compose的详细使用指南,综合最新技术实践和官方文档整理: 一、环境配置与基础架构 项目创建 在Android Studio中选择Empty Compose Activity模板,默认生成包含Composable预览的MainActivity2要求Kotlin版本≥1.8.0&…...
潇洒郎: 100% 成功搭建Docker私有镜像仓库并管理、删除镜像
1、Registry Web管理界面 2、拉取Registry-Web镜像 创建配置文件 tee /opt/zwx-registry/web-config.yml <<-EOF registry:url: http://172.28.73.90:8010/v2name: registryreadonly: falseauth:enabled: false EOF 拉取docker-registry-web镜像并绑定Registry仓库 …...
【Spring Boot 注解】@ConfigurationProperties
文章目录 ConfigurationProperties注解一、简介二、依赖引入三、基本用法四、主要特性五、激活方式六,优点七、与 Value 对比 ConfigurationProperties注解 一、简介 ConfigurationProperties 是 Spring Boot 提供的一个强大注解,用于将外部配置&#…...
阿里云服务迁移实战: 06-切换DNS
概述 按前面的步骤,所有服务迁移完毕之后,最后就剩下 DNS 解析修改了。 修改解析 在域名解析处,修改域名的解析地址即可。 如果 IP 已经过户到了新账号,则不需要修改解析。 何确保业务稳定 域名解析更换时,由于 D…...
Java实现归并排序算法
1. 归并排序原理图解 归并排序是一种分治算法,其核心思想是将数组分成两半,分别对这两半进行排序,然后将排序后的两半合并。以下是归并排序的步骤: 1. 分治: - 将数组分成两半。 - 递归地对每半部分进行归并排序。 2. …...
Vue 项目中运行 `npm run dev` 时发生的过程
步骤1:找到「任务说明书」(package.json) 当你输入 npm run dev,系统首先会去查项目的 「任务说明书」(即 package.json 文件),看看 dev 这个任务具体要做什么。 示例代码(package.json 片段)…...
Python3(19)数据结构
在 Python 编程中,数据结构是组织和存储数据的重要方式,合理选择和使用数据结构能显著提升程序的效率和可读性。这篇博客通过丰富的代码示例深入学习 Python3 的数据结构知识,方便日后复习回顾。 一、列表(List) 1.1…...
macOS 安装了Docker Desktop版终端docker 命令没办法使用
macOS 安装了Docker Desktop版终端docker 命令没办法使用 1、检查Docker Desktop能否正常运行。 确保Docker Desktop能正常运行。 2、检查环境变量是否添加 1、添加环境变量 如果环境变量中没有包含Docker的路径,你可以手动添加。首先,找到Docker的…...
VR 汽车线束培训:探索高效学习新路径
在汽车线束生产领域,VR 汽车线束培训对于新员工的成长至关重要,它是一个关键环节,直接影响着生产效率和产品质量。传统的培训方式,通常是新员工在老员工的指导下,通过实际操作来学习线束装配流程。这种方式不仅耗费大量…...
k8s术语之Deployment
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新 您只需要在Deployment中描述您想要的目标状态是什么,Deployment controller就会帮您将Pod和ReplicaSet的实际状态改变到您的目标状态。您可以定义一个全新的Deployment Controller的职责…...
对js的Date二次封装,继承了原Date的所有方法,增加了自己扩展的方法,可以实现任意时间往前往后推算多少小时、多少天、多少周、多少月;
封装js时间工具 概述 该方法继承了 js 中 Date的所有方法;同时扩展了一部分自用方法: 1、任意时间 往前推多少小时,天,月,周;参数1、2必填,参数3可选beforeDate(num,formatter,dateVal); befo…...
17、商品管理:魔药商店运营——React 19 CRUD实现
一、魔药商店的炼金基石 1. 魔药配方契约(数据模型设计) // 预言池契约(Supabase Schema) interface Potion { id: uuid, name: string, effect: healing | transformation | attack, stock: number, moonSensitive: boo…...
2025-04-30 AIGC-如何做短片视频
摘要: 2025-04-30 AIGC-如何做短片视频 如何做短片视频: 一、画图修图 1.保存视频(无水保存) 2.文案提取(提取文案) 3. DeepSeek(提示词) 4.小梦Ai(图片视频) 5.修图Ai 6.扩图Ai 7.养生…...
【自然语言处理与大模型】如何获取特定领域的微调数据集?
在特定领域中,数据集通常由提出需求的一方提供。然而,在某些情况下,如果他们未能提供所需的数据,或者你正在独立开展一个项目,并且需要相应的数据来推进工作,这时你应该怎么办呢?本文提供一种思…...
算法导论第6章思考题
6.3-2 func(A) 1 A.heap-sizeA.len 2 \quad for i ⌊ A . l e n 2 ⌋ \lfloor {A.len\over2}\rfloor ⌊2A.len⌋ downto 1 3 \qquad MAX-HEAPIFY(A,i) 对于第2行的循环控制变量i来说,为啥要求它是从 ⌊ A . l e n 2 ⌋ \lfloor {A.len\over2}\rfloor ⌊2A.len⌋…...
论文阅读:2024 ACM SIGSAC Membership inference attacks against in-context learning
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Membership inference attacks against in-context learning https://arxiv.org/pdf/2409.01380 https://www.doubao.com/chat/4030440311895554 速览 这篇论文主要研究了…...
读论文笔记-CoOp:对CLIP的handcrafted改进
读论文笔记-Learning to Prompt for Vision-Language Models Problems 现有基于prompt engineering的多模态模型在设计合适的prompt时有很大困难,从而设计了一种更简单的方法来制作prompt。 Motivations prompt engineering虽然促进了视觉表示的学习,…...
国产化海光C86架构服务器安装windows实录
最近几年与红蓝关系急转直下,尤其是科技领域尤为突出。随之而来的就是软硬件的国产化大潮。由于行业的原因根据要求必须使用国产化服务器、国产化操作系统、国产化数据库、国产化中间件。虽然闭关锁国断开红蓝联系可以在一定程度激发国产化发展,但是不得…...
基于SpringBoot的旅游网站的设计与实现
资源详情: 私信我或点击链接获取: 基于SpringBoot的旅游网站的设计与实现资源-CSDN文库 摘要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外…...
【Axure教程】增删改饼图
今天教大家制作增删改饼图的原型模版,该模版是用Axure原生元件制作的,所以不需要联网或者调用外部接口,使用也很方便,默认数据在中继器表格里填写,默认支持20个不同颜色的扇形,后续可根据实际需要自己增加扇…...
FastAPI系列12:使用JWT 登录认证和RBAC 权限控制
使用JWT 登录认证和RBAC 权限控制 1、身份认证(Authentication)与JWT身份认证(Authentication)的方式JWT(JSON Web Token)的实现原理 2、授权(Authorization)与RBAC授权(…...
定时任务xxl-job国产化改造,适配磐维数据库(PostgreSQL)
前言 因公司要求系统需要全面国产化改造,其中也涉及到定时任务xxl-job的改造。 使用的xxl-job版本为:2.5.0 一、修改配置 1、修改pom.xml,引入postgresql组件 <dependency><groupId>org.postgresql</groupId><artif…...
2025华东杯ABC题赛题已出速拿
2025华东杯ABC题赛题已出速拿 A: B: C:...
PostgreSQL事务与并发清理
1.并发清理概述 清理过程为指定的表,或数据库中的所有表执行以下任务。 1. 移除死元组 移除每一页中的死元组,并对每一页内的活元组进行碎片整理。 移除指向死元组的索引元组。 2. 冻结旧的事务标识(txid) 如有必要…...
基于DeepSeek与HTML的可视化图表创新研究
一、研究背景 在当今数字化时代,数据呈指数级增长,广泛渗透于社会各个领域。无论是商业运营、科学研究,还是公共管理等方面,海量数据蕴含着丰富的潜在价值,成为驱动决策优化、推动业务发展、促进科学创新的关键要素。数…...
游戏引擎学习第250天:# 清理DEBUG GUID
设置阶段,重新开始清理调试层 今天,我们将继续进行之前未完成的任务,主要是清理调试层的代码,并为其在游戏中使用做好准备。昨天我原本准备清理一些代码,但没能完成,所以今天我们将从那里开始,…...
删除k8s某命名空间,一直卡住了怎么办?
以 kubectl delete ns cert-manager 命令卡住为例,并且命名空间一直处于 Terminating 状态,说明 Kubernetes 无法完成删除操作,通常是因为 Finalizers 阻塞或某些资源无法正常清理。 解决方法 1. 检查命名空间状态 kubectl get ns cert-man…...
聊一聊接口自动化测试断言处理策略
目录 一、断言设计原则 1.1精准性 1.2可维护性 1.3容错性 二、常见断言类型及实现 2.1基础验证 2.2响应体验证 2.3业务逻辑验证 2.4异常场景验证 2.5数据库断言 三、断言策略 3.1 精准断言 vs 模糊断言 3.2关键字段优先 3.3数据动态处理 四、多断言处理 4.1单用…...
C# 实现列式存储数据
C#实现列式存储数据指南 一、列式存储概述 列式存储(Columnar Storage)是一种数据存储方式,它将数据按列而非行组织。与传统的行式存储相比,列式存储在以下场景具有优势: 分析型查询:聚合计算、分组统计等操作效率更高…...
vscode中设置eslint保存时自动格式化未生效
vscode中设置eslint保存时自动格式化未生效 设置一 设置二 上述设置二未勾选导致未生效...
力扣HOT100——207.课程表
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如…...
开源协议全解析:类型、选择与法律风险规避指南
[TOC] 在当今开源软件主导的技术生态中,开源协议(Open Source License)是决定项目能否被商业使用、二次开发的关键法律文件。据统计,GitHub上超过70%的项目使用某种形式的开源协议,但其中近30%存在协议兼容性问题。本…...
Android学习总结之自定义view设计模式理解
面试题 1:请举例说明自定义 View 中模板方法模式的应用 考点分析 此问题主要考查对模板方法模式的理解,以及该模式在 Android 自定义 View 生命周期方法里的实际运用。 回答内容 模板方法模式定义了一个操作的算法骨架,把一些步骤的实现延…...
Kubernetes Ingress 深度解析
Kubernetes Ingress 深度解析 一、Ingress 基本概念 Ingress 是 Kubernetes 中管理外部访问集群服务的 API 对象,提供 HTTP/HTTPS 路由规则,实现以下功能: 基于域名/路径的路由TLS/SSL 终止负载均衡流量控制 与传统服务的区别 特性Ingre…...
rk3568安全启动功能实践
本文主要讲述笔者在rk3568芯片上开发安全启动功能实践的流程。其中主要参考瑞芯微官方文档《Rockchip_Developer_Guide_Secure_Boot_for_UBoot_Next_Dev_CN.pdf》。文档中描述逻辑不是很清晰而且和当前瑞芯微的sdk中安全启动的流程匹配度不高。本文就不再对瑞芯微官方文档的内容…...
transformer-实现解码器Decoder
Decoder 论文地址 https://arxiv.org/pdf/1706.03762 Decoder结构介绍 Transformer Decoder是Transformer模型的核心生成组件,负责基于编码器输出和已生成内容预测后续token。通过堆叠多层结构相同的解码层(Decoder Layer),每层包…...
iOS RunLoop 深入解析
本文深入探讨 iOS 中 RunLoop 的实现原理、工作机制以及实际应用。通过源码分析和实际案例,帮助读者全面理解 RunLoop 在 iOS 系统中的重要作用。 一、RunLoop 基础概念 1. RunLoop 的定义与作用 RunLoop 是 iOS 系统中用于处理事件和消息的循环机制。它负责管理线…...
软考中级-软件设计师 数据结构(手写笔记)
第一章:基础 基础知识 五大特性 第二章:线性表 第三章:栈和队列 队列 广义表 第四章:树和二叉树 基础知识 树转二叉树和二叉排序树 哈夫曼树 线索二叉树和平衡二叉树 第五章:图 基础知识和邻接矩阵和邻接表 图的遍…...
/var/log/sssd/` 目录解析
/var/log/sssd/ 是 System Security Services Daemon (SSSD) 的专用日志目录,用于记录与身份认证、用户/组信息查询、缓存管理等相关的操作。以下是该目录的详细解析: 1. 目录结构 默认情况下,/var/log/sssd/ 包含以下日志文件: /var/log/sssd/ ├── sssd.log …...
C++负载均衡远程调用学习之Reactor事件触发机制
目录 1.LARV0.2-REACTOR_BUF实现 2.LARV0.2-outpu_buf实现 3.LARV0.2-reactor继承内存管理 4.LARV0.2流程总结 5.LARV0.3-多路IO事件的分析 6.LARV0.3_io_event和event_loop定义 7.LARV0.3_event_loop添加一个事件 8.LARV0.3_event_loop的epoll_wait封装 9.LARV0.3-eve…...