【C++详解】string各种接口如何使用保姆级攻略
文章目录
- 一、string介绍
- 二、string使用
- 构造函数
- 析构函数
- 赋值运算符重载
- string的遍历+修改方法
- 1、下标+[]
- 2、迭代器
- 3、范围for
- 迭代器使用详解
- const迭代器
- 反向迭代器(reverse)
- Capacity(容量相关)
- size/length
- max_size
- capacity
- clear/empty
- shrink_to_fit(缩容)
- reserve(扩容)
- resize
- element access(数据访问)
- operator[]/at
- back/front
- Modifiers(修改相关)
- append(追加)/operator+=
- assign(赋值)
- insert/erase
- repalce
- String operations
- c_str/data
- copy
- substr
- find/rfind
- find_first_of/find_last_of
- 非成员函数
- 关系运算符
- operator+
- getline
- 三、总结
一、string介绍
在学习string之前我们要先了解string其实诞生的比STL早,所以从发展历史角度来看你它应该归于标准库,但是从广义来看它又应归于STL,因为它也是数据结构,它也有STL的各种通用接口。
从这里我们可以看到我们要学习的string是属于C++标准库的类,并且是经过类模板实例化的具体类型,本质上可以看作的管理char字符的顺序表,也可以简单理解成字符串。
注意:要使用string需要using namespace std和包string头文件。
二、string使用
构造函数
string的构造函数很多,这里我们介绍最常见的几种。
1、默认构造 string()
string s1;
2、用常量字符串构造string(const char* s)
string s2("good moring");
3、拷贝构造 string(const string& str)
string s3(s2);
4、子串构造 string(const string& str, size_t pos, size_t length = npos)
它的功能是用string的一部分用来拷贝构造,该部分是从pos这个位置到length位置,其中length给了一个缺省参数npos(缺省参数只能用常量,全局变量或者静态变量),它是string的静态成员变量,它的值是整型的最大值,因为string一般不会有这么长,所以用这个值就是为了让string有多少拷贝多少,直到结尾。
string s4(s3, 1, 7);
5、拷贝前n个字符构造 string(const char* str, size_t n)
const char* str = "hello world";string s5(str, 7);
6、用n个c字符构造 string(size_t n, char c)
string s6(100, 'x');
析构函数
因为string没有动态开辟空间的成员变量,所以就不需要回收资源,调用它的默认析构函数就好了,所以析构我们就不展开讨论了。
赋值运算符重载
string s1("good moring");string s2;s2 = s1;s2 = "wusaqi";s2 = 'x';
string的遍历+修改方法
平时我们使用string这个类,遍历和修改操作是不可避免的,接下来小编会介绍三种方法来实现。
1、下标+[]
我们首先来认识一下string里的operator[]函数,它可以返回string的第pos位置的字符,如果越界了还会报错,并且返回的是引用,代表返回后你还可以修改它。
我们首先可以看到它重载了两个函数,一个参数(也就是this指针)没被const修饰,返回值为char&,一个参数被const修饰,返回值为const char&,但是我们一般只用实现const版本的就行了,因为普通对象也可以调用const,可这里为什么要实现两种呢?因为这样可以让对象使用到最匹配它的函数,因为编译器会去找最匹配对象的函数,不然普通对象去调用后返回的对象就变成不能修改了,违背了我们本意。
string s1("good morning");for (int i = 0; i < s1.size(); i++){s1[i]++;}cout << s1 << endl;
这样我们就能遍历和修改这个string了,让每一个字符+1。 这里的size接口能返回string的字符个数,但是我们看c++网站就会发现还有一个和size一样功能的接口length,这里其实就涉及到我们之前谈到的历史发展的原因,在STL还没出现的时候string用的就是length,但是当后面STL归进来后为了统一接口才又引入的size。
2、迭代器
在STL容器中都会有迭代器(iterator),它是类型属于这个容器的类型的类域,迭代有遍历的意思,迭代器的用法和指针很相似,可以先把它简单想象成像指针一样的类型对象。
我们要得到迭代器就需要2个成员函数:begin() 和 end(),begin() 返回第一个数据位置的迭代器,end() 返回最后一个数据下一个位置的迭代器,所以可以得到这两个成员函数返回的迭代器的区间是左闭右开的。
用法如下:
string::iterator it1 = s1.begin();while (it1 != s1.end()){//改变迭代器所在位置的值(*it1)--;//让迭代器向前移动it1++;}
迭代器的意义:
1、同一类似的方式遍历修改容器。
2、算法脱离具体底层结构,和底层结构解耦,算法独立模板实现针对多个容器处理。
3、范围for
在学习范围for之前我们要先了解一些C++11的新特性:
1、auto是关键字,可以自动推导对象的类型,它和具体类型一样,不加&是拷贝,加&才是引用。当auto推导指针时,可以用 auto 也可以用 auto* ,只不过前者可以推导任意类型,后者只能推导指针。
auto x = 8;auto y = 8.8;cout << x << endl;cout << y << endl;int& z = x;auto m = z; //拷贝auto& n = z; //引用auto p = &x;auto* p = &x; //只能推导指针
范围for也是C++11支持的新特性,所有容器都支持,它的用法如下:
string s1("hello world");for (auto ch : s1){cout << ch << " ";}
上面这段代码做了什么?简而言之就是3个自动:
自动取容器数据赋值给ch(ch位置的名称可以随意取)
自动判断结束
自动迭代(向后遍历)
1、但是范围for无法修改容器里的数据,因为它的底层本质还是会替换成迭代器,就是把*迭代器赋值传递给ch,所以改变ch对容器里的数据没有影响,如果想改变容器里数据就要在zuto后边加&,成为引用。
string s1("hello world");for (auto& ch : s1){cout << ch << " ";}
2、范围for里面的auto也可以写成具体类型,但是一定要和容器的数据类型匹配。
string s1("hello world");for (int ch : s1){ch++;}
3、范围for不仅支持容器,数组也支持。
int arr[] = { 1,2,3,4,5 };for (auto ch : arr){cout << ch << " ";}
迭代器使用详解
先前我们简单了解了一下迭代器,接下来小编详细介绍一下string中各种迭代器和它们的用法。
const迭代器
我们看上图可以发现begin()和end()都有两个重载函数,一个普通版,一个const版,当对象没被const修饰时调用普通版,当对象被const修饰时则调用const版,这里我们要注意其中const版本不是const iterator,而是const_iterator,因为如果是前者的话const是修饰迭代器本身无法改变,但是迭代器遍历会一直改变,实践中没法使用,后者才是修改迭代器指向的内容无法改变,这里可以把const_iterator简单理解成一种类型。
string s1("hello world");string::iterator it1 = s1.begin();const string s2("hello world");string::const_iterator it2 = s1.begin();
反向迭代器(reverse)
获取反向迭代器的函数也有两种重载,也是一种普通版,一种const版,这里注意,因为是反向迭代器,所以它是从后向前遍历的,所以rbegin()返回的是最后一个字符的位置,rend()返回的是第一个字符的前一个位置,迭代器++也是从后往前走的。
迭代器在STL容器中的意义(用法):
1、遍历和修改容器数据。
2、可以把容器数据以迭代器发方式传给算法,因为算法一般是按函数模板传迭代器区间的方式,用迭代器访问容器数据就可以实现算法和容器的底层解耦。
这里还要补充一点,cbegin()和cend()是返回确定的const对象,但是实践中很少这样用,了解一下就行。
Capacity(容量相关)
在了解容量相关接口之前我们先认识一下string包含哪些内容,具体等我们后面讲到底层实现时小编再仔细讲解,这里我们先大致了解一下:其中有有动态开辟的字符数组_str,字符数组中的有效数据个数_size,还有数组容量_capacity,这里的我们要介绍的接口就是围绕它来展开。
size/length
它们都是返回字符个数的接口,前面我们详细介绍过,这里小编就不赘述了。
max_size
这其实是一个没有参考意义的接口,了解一下就行,它返回的是理想情况下size最大能有多大,也就是string最长能有多长。
capacity
我们在使用string过程中难免会插入数据,但是它的容量是动态开辟的,如果你插入一次扩容一次效率就会变得很低,所以引入capacity就是为了解决这一问题,要扩容就会在当前容量的基础上2倍或1.5倍扩容。
1、这里我们还要注意size和capacity的返回值规定均不包含 \0,所以这里size显示是11,但是实际上是12,还要包含\0,capacity能存15个有效字符,所以实际要开16个字符空间。
2、扩容机制C++并没有统一规定,所以具体实现都由编译器厂商实现,比如vs是第一次二倍扩容,后续是1.5倍,而linux(g++)则是二倍扩容。
clear/empty
clear和empty很简单,这里就一起讲了。
clear是将string中所有数据清空,但是capacity不会改变,可以理解成我们在单链表时的size–。
empty就是string对象判空,若当前对象为空,则返回1,若不为空则返回0。
shrink_to_fit(缩容)
- 文档中说明该接口是把空间减少到可以适配size,就是把多余的空间都释放了,但是我们看文档下面:这个请求是no-binding(不具有约束力的),所以编译器可能由于内存对齐之类的原因最后实现出来capacity是大于size的,也就是并没有把多余的空间全部释放。
- C++规定动态申请的连续的数组空间只支持完整的申请和释放,不能部分释放,所以缩容代价是很大的,它不支持原地缩容,我们想缩容只能重新申请一块空间,再把数据拷贝过来,再释放旧空间。
- 所以缩容可以理解成是以时间换空间,在如今来看,我们普遍都会采用以空间换时间,现代设备内存普遍都比较大,时间在我们看来会更重要。
reserve(扩容)
- 我们看文档可以发现扩容也不是完完全全按照你给的n值来扩容的,假设你要扩到100,最后是可能比100还大的。
- 当n比capacity小时,我们会期望它能缩容,但是读文档它对缩容是不具有约束力的,也就是缩与不缩是取决于编译器,所以我们要缩容最好使用shrink_ti_fit,但是缩容我们都是不建议用的。
- reverse是不会影响字符串内容和长度的。
- 扩容是我们常用的接口,因为当我们确定知道需要多少空间时,可以用它提前开好,避免 多次扩容,提高效率。
resize
这是改变字符串长度的接口,我们看到它重载了两个函数,当n比size大时,它会插入字符直到符合我们想要的长度,如果没有指定字符,默认会插入 ‘\0’,如果指定了字符,就会插入我们指定的字符。
改变字符串长度有三种情况,让小编来举例介绍:
1、n大于capacity:插入数据+扩容
(这里扩容也有可能比要求的空间大)
2、n大于size小于capacity:插入数据
3、n小于size: 删除数据
(删除多余字符,只保留前n个字符,不会缩容)
当我们不指定字符插入时,就会默认插入 ‘\0’,这个过程打印不好观察,我们借助监视来看:
element access(数据访问)
operator[]/at
- operator[]我们前面也介绍过,小编这里想补充的是它不同于字符数组的指针+解应用访问,对于越界的检查只是抽查行为,并且只能检查越界写。operator[]因为它是函数,所以对越界检查非常严格,我们后面学习底层会发现其实就是函数一来就用了assert断言,但是assert在release下会不起作用,并且assert是直接终止程序。
- at功能和operator[]相同,但是它越界检查的方式是抛异常,可被捕获,不会影响程序终止。
- 一般情况下我们还是用operator[],因为程序最开始都要走debug版,一但越界就能马上检查出来。
back/front
back是返回尾部位置的字符,front是返回头部位置的字符,这两个我们都用的比较少。
Modifiers(修改相关)
append(追加)/operator+=
我们前面介绍的push_back只能插入单字符,接下来这两个接口功能相似,都可以在string后面追加单字符、常量字符串或者string对象,但是我们更喜欢用operator+=,因为理解起来更形象。
assign(赋值)
这和我们前面介绍到的operator=功能也差不多,只是多重载了几种赋值方法。
insert/erase
string没有提供头部的插入删除接口,所以要实现头部或者中间部分的插入删除就需要借助这两个接口:
insert:在指定位置之前插入数据。
erase:删除指定位置及指定位置之后长度为n的字符或字符串,如果不传长度就会将这个位置及之后的所有数据全部删完,因为给了个缺省值npos(整型的最大值)。
(但是这两个接口要谨慎使用,因为string底层是数组,在数组当中插入删除就势必会挪动数据,会使时间效率变低。)
repalce
这个接口可以实现将单个字符或者字符串替换成单个字符或字符串。
(该接口也要谨慎使用,因为也有可能涉及数据的挪动)
String operations
c_str/data
在实际项目中,我们可能会遇到一些接口只能用C语言调用,比如文件操作fopen只能通过const char*类型的对象来调用,但是在C++项目中只有string,该接口就是为了解决这一问题,它能返回string在堆上的动态数组的首元素的地址。
data的功能和c_str完全一致,这也是一些历史原因造成的。
copy
这是拷贝接口,从pos位置开始拷贝len个字符给s,返回值是拷贝过来的有效数据个数,但是这个接口我们很少用。我们拷贝子串通常是用下面介绍的substr。
substr
这个拷贝接口和copy的不同在于它是用子串构造一个string对象再返回,使用更方便。
find/rfind
这是查找接口,从pos位置开始向后查找指定内容,找到了就返回找到位置下标,未找到或者找完了就返回npos。
下面这个例子就是find和replace一起使用,将字符串中所有空格字符替换为%%,pos+2目的是替换后不再从头开始找,而是从%%的下一个位置开始找,提高效率。但是replace我们都不建议用,更建议用第二种方法。
第二种方法就是创建一个新string,先将新空间开到和原字符串一样的大小,依次遍历原字符串若遍历到空格就插入##,若不为空格就按原字符插入。
(该方法就是以空间换时间,不用像replace那样挪动数据)
rfind基本和find一样,只不过它是从后往前找。
find_first_of/find_last_of
这两个接口我们用的非常少,它的功能是找到并返回目标字符串中所有你提供的字符串的字符的下标,比如下面这段代码,它能找到str中所有‘a’‘e’ ‘i’ ‘o’ 'u’的字符的下标并返回。
find_last_of是从后往前找。
std::string str ("Please, replace the vowels in this sentence by asterisks.");std::size_t found = str.find_first_of("aeiou");while (found!=std::string::npos){str[found]='*';found=str.find_first_of("aeiou",found+1);}std::cout << str << '\n';
非成员函数
关系运算符
关系运算符放在非成员函数里的原因是为了支持第二种字符串与string比较的情况,因为如果是成员函数那么第一个参数必定是string(this指针)。
operator+
把它放在非成员函数的原因和关系运算符一样。
getline
这个接口是为了解决我们要提取一串字符串的情况,因为如果我们用cin提取字符串它只会提取到空格或者换行符之前,如果这段字符有多个空格比如“good morning wusaqi”,cin只会提取“good”,如果用getline就可以读一行,直到遇到换行符才终止。
我们看到它还有一个重载版本,三个参数delim可以让我们自己规定读取结束的标志字符。
三、总结
string的各种接口其实不用我们刻意去记,在用的时候慢慢熟悉就行了。 其中比较重要的接口就是增删查改+遍历:
增:operator+=/insert
删:erase
查:find
改:operator[]/迭代器
以上就是小编分享的全部内容了,如果觉得不错还请留下免费的赞和收藏
如果有建议欢迎通过评论区或私信留言,感谢您的大力支持。
一键三连好运连连哦~~
相关文章:
【C++详解】string各种接口如何使用保姆级攻略
文章目录 一、string介绍二、string使用构造函数析构函数赋值运算符重载string的遍历修改方法1、下标[]2、迭代器3、范围for 迭代器使用详解const迭代器反向迭代器(reverse) Capacity(容量相关)size/lengthmax_sizecapacityclear/emptyshrink_to_fit(缩容)reserve(扩…...
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
requestIdleCallback 核心作用 requestIdleCallback 是浏览器提供的 API,用于将非关键任务延迟到浏览器空闲时段执行,避免阻塞用户交互、动画等关键任务,从而提升页面性能体验。 基本语法 const handle window.requestIdleCallback(callb…...
QML鼠标事件和按键事件
1 鼠标事件 1.1 MouseArea组件 在QML中,鼠标事件主要通过MouseArea元素处理,它是用于检测和响应鼠标交互的核心组件。常用属性 cursorShape: 光标形状acceptedButtons: 设置响应鼠标的哪些按键事件,默认为鼠标左键 Qt.LeftButton࿱…...
Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念:我想要一个动画编辑器 那天我突然想到,如果能有一个简单好用的 CSS 动画编辑…...
Git 版本控制系统入门指南
Git 版本控制系统入门指南 一、Git 基础概念 1. 什么是 Git? Git 是一个分布式版本控制系统,它可以: 跟踪文件变化协调多人协作管理代码版本支持离线工作保证数据完整性 2. Git 的特点 分布式架构快速分支操作完整历史记录数据完整性保…...
GitHub 趋势日报 (2025年05月16日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 4792⭐ 19814Roff2xming521/WeClone&…...
C/C++之内存管理
1. 内存分布 我们定义的变量对于电脑来说也叫数据,同时电脑也会把这些数据分为不同的类型,分别是局部数据,静态数据,全局数据,常量数据和动态申请数据。 在 C 中,各类数据存储位置如下: • 局…...
GitHub文档加载器设计与实现
文章结构: 目录 GitHub文档加载器设计与实现 引言 架构设计 主要组件 核心功能 文档加载流程 加载单个文件 加载目录内容 错误处理与健壮性 分支回退策略 文件类型和大小限制 安全性考虑 SSL证书验证 使用示例 基本使用 测试环境配置 最佳实践 结…...
历史数据分析——中证白酒
简介 中证白酒指数选取涉及白酒生产业务相关上市公司证券作为指数样本,为投资者提供更多样化的投资标的。 估值 中证白酒总体的PB是5.26,在过去十年间位于23.76%,属于较低的水平。 中证白酒总体的PE是20.13,在过去十年间,位于14.24%,属于较低的水平。 从估值的角度似…...
PHP8.0版本导出excel失败
环境:fastadmin框架,不是原版接手的项目。PHP8.0,mysql5.7. code // 创建一个新的 Spreadsheet 对象 $spreadsheet new Spreadsheet(); $worksheet $spreadsheet->getActiveSheet();// 设置表头 $worksheet->setCellValue(A1, ID); $worksheet…...
Seata源码—5.全局事务的创建与返回处理二
大纲 1.Seata开启分布式事务的流程总结 2.Seata生成全局事务ID的雪花算法源码 3.生成xid以及对全局事务会话进行持久化的源码 4.全局事务会话数据持久化的实现源码 5.Seata Server创建全局事务与返回xid的源码 6.Client获取Server的响应与处理的源码 7.Seata与Dubbo整合…...
mac-M系列芯片安装软件报错:***已损坏,无法打开。推出磁盘问题
因为你安装的软件在Intel 或arm芯片的mac上没有签名导致。 首先打开任何来源操作 在系统设置中配置,如下图: 2. 然后打开终端,输入: sudo spctl --master-disable然后输入电脑锁屏密码 打开了任何来源,还遇到已损坏…...
端到端自动驾驶系统实战指南:从Comma.ai架构到PyTorch部署
引言:端到端自动驾驶的技术革命 在自动驾驶技术演进历程中,端到端(End-to-End)架构正引领新一轮技术革命。不同于传统分模块处理感知、规划、控制的方案,端到端系统通过深度神经网络直接建立传感器原始数据到车辆控制…...
MoveIt Setup Assistant 在导入urdf文件的时候报错
在使用MoveIt Setup Assistant导入urdf文件的时候(load a urdf or collada robot model),找到urdf文件后MoveIt Setup Assistant闪退并报错: Warning: Ignoring XDG_SESSION_TYPEwayland on Gnome. Use QT_QPA_PLATFORMwayland to run on Wayland anyway…...
uniapp +vue +springboot多商家订餐系统
uniapp vue springboot多商家订餐系统,这个系统我整理调试的多商家,多用户的,多端小程序订餐系统,主要包含了uniapp小程序端,管理后台页面vue端,后台功能接口Springboot端,源码齐全,…...
docker迅雷自定义端口号、登录用户名密码
在NAS上部署迅雷,确实会带来很大的方便。但是目前很多教程都是讲怎么部署docker迅雷,鲜有将自定义配置的方法。这里讲一下怎么部署,并重点讲一下支持的自定义参数。 一、部署docker 在其他教程中,都是介绍的如下命令,…...
联想笔记本黑屏了,排线出问题还是静电
以下引用 联想电脑屏幕不亮,电源键和键盘灯均正常的解决办法(超简单)_拯救者屏幕不亮,键盘有电-CSDN博客 昨天正常关机后,今天一早来工位打开电脑,美美开始玩手机。 一会之后抬头屏幕是黑的,还以为自动息…...
uniapp -- uCharts 仪表盘刻度显示 0.9999999 这样的值问题处理。
文章目录 🍉问题🍉解决方案🍉问题 在仪表盘上,23.8变成了 23.799999999999997 🍉解决方案 formatter格式化问题 1:在 config-ucharts.js 或 config-echarts.js 配置对应的 formatter 方法 formatter: {yAxisDemo1: function (...
为 Spring Boot 应用程序构建 CI/CD 流水线
为 Spring Boot 应用程序创建构建/部署流水线涉及多个步骤,而 Jenkins 可以作为强大的工具来自动化这些流程。在本教程中,我们将指导您为托管在 GitHub 上的 Spring Boot 应用程序设置流水线,使用 Jenkins 构建该应用程序,并将其部…...
数值分析填空题速通
填空题速通 文章目录 填空题速通误差与误差传播均差插值与误差范数、赋范线性空间与内积、内积空间范数代数精度数值微分积分误差迭代方程与收敛阶微分方程数值解法的迭代公式与阶 误差与误差传播 例 设 a 1.414 a 1.414 a1.414, b − 0.576 b -0.576 b−0.57…...
day016-系统负载压力测试-磁盘管理
文章目录 1. 系统负载2. 模拟系统高负载2.1 模拟cpu负载2.2 模拟IO负载 3. 磁盘接口分类4. 思维导图 1. 系统负载 系统负载是衡量系统繁忙程度的指标负载值接近或超过cpu核心总数表示系统负载高负载高常见原因:1.占用cpu过多导致2.占用磁盘IO过多导致(I…...
DeepSeek指令微调与强化学习对齐:从SFT到RLHF
后训练微调的重要性 预训练使大模型获得丰富的语言和知识表达能力,但其输出往往与用户意图和安全性需求不完全匹配。业内普遍采用三阶段训练流程:预训练 → 监督微调(SFT)→ 人类偏好对齐(RLHF)。预训练阶段模型在大规模语料上学习语言规律;监督微调利用人工标注的数据…...
安全性(一):加密算法总结
一、加密算法分类总览 加密类型关键特性代表算法主要用途对称加密加解密使用同一个密钥DES、3DES、AES、SM4数据加密传输、存储非对称加密公钥加密,私钥解密(或反向)RSA、DSA、ECC、SM2密钥交换、数字签名、身份认证哈希算法不可逆摘要MD5、…...
DeepSeek 赋能军事:重塑现代战争形态的科技密码
目录 一、引言:AI 浪潮下的军事变革与 DeepSeek 崛起二、DeepSeek 技术原理与特性剖析2.1 核心技术架构2.2 独特优势 三、DeepSeek 在军事侦察中的应用3.1 海量数据快速处理3.2 精准目标识别追踪3.3 预测潜在威胁 四、DeepSeek 在军事指挥决策中的应用4.1 战场态势实…...
我司助力高校打造「智慧创新AI学习中心」
为推动AI教育融合跨领域应用,东吴大学于2025年4月举行「智慧创新AI学习中心」揭牌仪式,并宣布正式启动AI特色课程与教学空间建置计画。此次建置由我司协助整体教室空间与设备规划,导入最新NVIDIA GeForce RTX 50系列桌上型电脑,并…...
AI赋能把“杂多集合”转化为“理想集合”的数学建模与认知升级
AI赋能把“杂多集合”转化为“理想集合”的数学建模与认知升级 一、核心概念定义 杂多集合(Chaotic Set) 定义:元素间关系模糊、结构无序的集合 数学表达:C{x∣x∈X,P(x)},其中 P(x) 是模糊隶属函数 实例…...
NVC++ 介绍与使用指南
文章目录 NVC 介绍与使用指南NVC 简介安装 NVC基本使用编译纯 C 程序编译 CUDA C 程序 关键编译选项示例代码使用标准并行算法 (STDPAR)混合 CUDA 和 C 优势与限制优势限制 调试与优化 NVC 介绍与使用指南 NVC 是 NVIDIA 提供的基于 LLVM 的 C 编译器,专为 GPU 加速…...
Redis 事务与管道:原理、区别与应用实践
在现代分布式系统开发中,Redis 作为高性能的内存数据库,其事务处理和管道技术是开发者必须掌握的核心知识点。本文将深入探讨 Redis 事务和管道的实现原理、使用场景、性能差异以及最佳实践,帮助开发者根据实际需求选择合适的技术方案。 一、…...
Git 多人协作
目录 情景一 情景二 合并分支 情景一 目标:远程 master 分支下的 file.txt 文件新增代码 "aaa","bbb"。 实现:由开发者1新增 "aaa" ,开发者2新增 bbb。 条件:在一个分支下合作完成。 针对以上情景我们要注意…...
Unity 人物模型学习笔记
一、关于模型的检查 拿到人物模型时,检查人物: 位置信息是否在0点布线/UV是否正常身体各部分是否分开各部分命名是否清晰骨骼需要绑定 二、Unity人物动画 https://www.bilibili.com/video/BV1cc41197mF?spm_id_from333.788.recommend_more_video.-1&a…...
【和春笋一起学C++】(十四)指针与const
将const用于指针,有两种情况: const int *pt; int * const pt; 目录 1. const int *pt 2. int * const pt 3. 扩展 1. const int *pt 首先看第一种情况,const在int的前面,有如下语句: int peoples12࿱…...
AI知识梳理——RAG、Agent、ReAct、LangChain、LangGraph、MCP、Function Calling、JSON-RPC
AI技术I AI技术II RAG 📌 高度凝练表达 RAG (检索增强生成)是一种结合信息检索与生成式人工智能的技术框架,旨在提升大型语言模型(LLM)的输出准确性和实用性。通过在生成响应前引入外部知识库的信息&#…...
ModuleNotFoundError: No module named ‘SDToolbox‘
(py311) C:>python Python 3.11.11 | packaged by Anaconda, Inc. | (main, Dec 11 2024, 16:34:19) [MSC v.1929 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. from SDToolbox import PostShock_eq Tracebac…...
在宝塔中使用.NET环境管理部署 .NET Core项目
本次采用的演示环境未腾讯云轻量级服务器,使用应用模板,选择宝塔liunx面板。 一、登录宝塔安装环境 直接选择免密登录 进入腾讯云webshell后,输入bt,选择14 选择网站选择.NET项目安装.NET环境管理安装对应的.NET 版本 注意&…...
【DAY21】 常见的降维算法
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 目录 PCA主成分分析 t-sne降维 线性判别分析 (Linear Discriminant Analysis, LDA) 作业: 什么时候用到降维 降维的主要应用场景 知识点回顾: PCA主成分分析t-sne降维LDA线性判别 通常情况下,…...
Linux面试题集合(3)
一秒刷新一次某个进程的状况 top -d 1 -p pid ’显示pid为1、2、3的进程的状况 top -p 1,2,3(按上键选择某个进程) 强制杀死进程 kill -9 pid 说一下ps和top命令的区别 ps命令只能显示执行瞬间的进程状态 top命令实时跟进进程状态 你在工作中什么情况下…...
Pytorch实现常用代码笔记
Pytorch实现常用代码笔记 基础实现代码其他代码示例Network ModulesLossUtils 基础实现代码 参考 深度学习手写代码 其他代码示例 Network Modules Pytorch实现Transformer代码示例 Loss PyTorch实现CrossEntropyLoss示例 Focal Loss 原理详解及 PyTorch 代码实现 PyTorc…...
vscode vue 项目 css 颜色调色版有两个
vue 项目 css 颜色调色版有两个,不知道是哪个插件冲突了。 这个用着很别扭,一个个插件删除后发现是 Vue - Official 这个插件问题,删了就只有一个调色版了。...
MySQL刷题相关简单语法集合
去重 distinct 关键字 eg. :select distinct university from user_profile 返回行数限制: limit关键字 eg. :select device_id from user_profile limit 2 返回列重命名:as 关键字 eg.:select device_id as user_in…...
MySQL多条件查询深度解析
一、业务场景引入 在数据分析场景中,我们经常会遇到需要从多个维度筛选数据的需求。例如,某教育平台运营团队希望同时查看"山东大学"的所有学生以及所有"男性"用户的详细信息,包括设备ID、性别、年龄和GPA数据ÿ…...
RT Thread FinSH(msh)调度逻辑
文章目录 概要FinSH功能FinSH调度逻辑细节小结 概要 RT-Thread(Real-Time Thread)作为一款开源的嵌入式实时操作系统,在嵌入式设备领域得到了广泛应用。 该系统不仅具备强大的任务调度功能,还集成了 FinSH命令行系统,…...
安装nerdctl和buildkitd脚本命令
#!/bin/bash set -euo pipefail # 检查是否以root权限运行 if [ "$(id -u)" -ne 0 ]; then echo "错误:请使用root权限或sudo运行本脚本" >&2 exit 1 fi # 检测openEuler系统(兼容大小写) detect_distrib…...
HTTP与HTTPS协议的核心区别
HTTP与HTTPS协议的核心区别 数据传输安全性 HTTP采用明文传输,数据易被窃听或篡改(如登录密码、支付信息),而HTTPS通过SSL/TLS协议对传输内容加密,确保数据完整性并防止中间人攻击。例如,HTTPS会生成对称加…...
51单片机仿真突然出问题
最近发现仿真出问题了,连最简单的程序运行结果都不对,比如,左移位<<,如果写P1 << 1;则没有问题,但写成P1 << cnt;就不对(cnt已经定义过,而且赋了初值&…...
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤: 第一步: 第二步: 第三步: 第四步: 第五步…...
uni-app小程序登录后…
前情 最近新接了一个全新项目,是类似商城的小程序项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,其中就有一个用户登录功能,小程序部分页面是需要登录才可以查看的,对于未登录的用户需要引…...
从零开始理解Jetty:轻量级Java服务器的入门指南
目录 一、Jetty是什么?先看一个生活比喻 二、5分钟快速入门:搭建你的第一个Jetty服务 步骤1:Maven依赖配置 步骤2:编写简易Servlet(厨房厨师) 步骤3:组装服务器(餐厅开业准备&am…...
如何免费在线PDF转换成Excel
咱们工作中是不是经常遇到这种头疼事儿?辛辛苦苦从别人那里拿到PDF文件,想改个数据调个格式,结果发现根本没法直接编辑! 数据被困住:PDF表格无法直接计算/筛选,手动录入太反人类! 格式大崩坏&…...
StarRocks MCP Server 开源发布:为 AI 应用提供强大分析中枢
过去,开发者要让大模型(LLM)使用数据库查询数据,往往需要开发专属插件、设计复杂的接口或手动构建 Prompt,这不仅费时费力,而且很难在不同模型之间复用。StarRocks MCP Server 提供了一个“通用适配器”接口…...
Vue百日学习计划Day21-23天详细计划-Gemini版
总目标: 在 Day 21-23 完成 Vue.js 的介绍学习、环境搭建,并成功运行第一个 Vue 3 项目,理解其基本结构。 Day 21: Vue.js 介绍与概念理解 (~3 小时) 本日目标: 理解 Vue.js 是什么、渐进式框架的概念以及选择 Vue 的原因。初步了解 Vite 是什么及其作用…...