当前位置: 首页 > news >正文

【语法】C++的string

目录

4个默认成员函数

迭代器

string的扩容:

capacity():

reserve(): 

resize():

插入与删除:

c_str:

find()和substr:

getline():


在C语言中,要想存储一串字符,往往用的都是char arr[],也就是字符数组,而在C++中,引入了一个比字符数组更方便,可执行的操作也更丰富的类:string,可以把string归类到STL里面,但实际上string出现的要比STL早。本篇将介绍string类中常用的20几个接口

4个默认成员函数

string构造函数可以说是相当的丰富,每个都有不同的用法

//默认构造函数string s1;//其他构造函数string s2("hello");//将s4初始化为hellostring s3(5,'a');//将s5初始化为5个'a',即"aaaaa" (不重要)string s4("hello",1,3);//将s6初始化为“hello”中从第1个字符开始的后3个字符  (不重要)string s5(s2,1,3);//将s6初始化为s2中从第1个字符开始的后3个字符  (不重要)string s6("hello",3);//将s7初始化为“hello”的前3个字符 (不重要) //拷贝构造函数string s7(s4);string s8 = s5;//默认赋值运算符重载s1 = "world";cout << s1 << endl << s2 << endl << s3 << endl << s4 << endl << s5 << endl << s6 << endl << s7 << endl;

输出结果是

要特别注意的是,在string s5("hello",1,3)这样用时,如果最后一个参数给的值超过了原字符串的总数,就会使用“npos” 这个值来代替它

npos是string中的一个静态const变量,指的就是直到结束的位置,它的值是-1,但是仔细看下图就可以发现,该变量是size_t类型,size_t也就是unsigned int,是没有负数的,所以-1也就是正整数的最大值的意思

当我们想往string类的后面尾插字符或字符串时,可以用接口函数

s1.push_back('A');//尾插一个字符A
s1.append("edd");//尾插一个字符串edd

 push_back()是尾插字符,append()是尾插字符串

可以看到append有很多种调用方法,和一开始讲到的构造函数的调用很相似,这里就不多讲述了(不重要)

但还有更简便的方法

s1+='A';//尾插一个字符A
s1+="edd";//尾插一个字符串edd

这是string类提供的operator+=运算符重载函数

可以看到有3个重载函数,分别用于字符,字符串(c-string)和string类 (c-string是指的以'\0'结尾的字符串)

迭代器

定义了一个string类后,如果想要遍历它,有三种方法

1. 用C语言阶段就学过的[]+下标的方式

string s1("Hello World");
for(size_t i=0;i<s1.size();i++)
{cout << s1[i] << " ";
} 

size()也是string的一个接口函数,会返回字符串的字符个数

其实还有一个接口函数叫length,这是早期string用来求字符个数的函数,和size一样,但后面STL出了之后也出了size,就用size比较多了

顺带一提,max_size()是用来求string类最多可以容纳的字符的,它的值是固定的

string s1;
cout << s1.max_size() << endl;

x86环境:2147483647        x64环境:9223372036854775807

2. 迭代器

string s1("Hello World");
string::iterator it = s1.begin();
while(it != s1.end())
{cout << *it << " ";it++;
}

string::iterator就是string类的迭代器类型,用这个类型定义的变量就是迭代器变量

begin()和end()也是string类中的接口函数,分别返回第一个字符的迭代器和最后一个字符的迭代器

可以看到begin和end都有两个函数,带const的和不带const的

其实迭代器也有分const和非const,上面演示的就是非const,如果在iterator的前面加上const_,即const_iterator,这就是const类型的迭代器

可以看到,如果it是const类型的迭代器,就不允许修改了,const迭代器存在的意义就是只让读不让写

而且,你如果是const类型的迭代器,再去调用begin和end函数,就会调用const类型的函数了

那如果想要从后往前遍历呢?还有个专门的反向迭代器,具体实现如下

string s1("Hello World");
string::reverse_iterator it = s1.rbegin();
while(it != s1.rend())
{cout << *it << " ";it++;
}

reverse_iterator就是反向迭代器,而rbegin就是reverse_begin的缩写,下面的rend也如此,既然迭代器变量是反向的,那就只能用rbegin和rend,如果用begin和end会报错

反向迭代器和const迭代器也可以组合,const_reverse_iterator就是const类型的反向迭代器

3.范围for

在C++11标准中,引入了一个新的遍历方法

string s1("Hello World");
string::iterator it = s1.begin();
for(auto a : s1)//范围for
{cout << a << " ";
}

即定义一个auto类型的a,来自于s1,编译器会将a推演成s1的迭代器类型的“解引用形式”(即*iterator),a会自动++,直到遍历完为止

string的扩容:

在C语言中,如果想要像string一样存储字符串,又可以插入删除操作,就要malloc空间并不断扩容(参考C语言实现容器(例如stack,heap,seqlist等)),而在C++中也一样

capacity():

string s1("Hello World");
cout << s1.capacity() << endl;

输出结果为15,但是s1里面只有11个字符啊?

因为string的容量并不是和字符数一致的,string扩容的流程是申请一块更大的空间->将原数据复制到新申请的空间上->释放原来的空间。    如果每次插入字符都需要再去扩容,那效率消耗就太大了。所以capacity的初始值为15,只要你的字符数还在15以下,就不会扩容。

那如果到了16,capacity会是多少呢?

string s1("Hello World11111");
cout << s1.capacity() << endl;

 会输出31

15到31,差不多2倍,真的是这样吗?

string s;
size_t sz = s.capacity();
cout << "making s grow:\n";
for (int i = 0; i < 100; ++i)
{s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << '\n';}
}

 这是一个用于检测capacity变化的程序

可以看到31后面是47而不是60,47后面不是90,但他们也并不是无规律可言,31*1.5=46.5, 47*1.5=70.5, 70*1.5是105,而且一般来说都会在1.5倍的基础上多开一个字符,用于存'\0'

(注:这是在VS环境下的倍增策略,如果是别的编译器,初始化时可能capacity和size相等)

reserve(): 

 一般来说,capacity是随着size的大小来1.5倍扩容的,但你也可以在size==capacity之前就给capacity扩容好指定的值

string s;
s.reserve(100);
size_t sz = s.capacity();
cout << "making s grow:\n";
for (int i = 0; i < 100; ++i)
{s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << '\n';}
}

reserve可以给capacity分配n个字符的空间,现在再执行,就会发现capacity不会再有变化了

需要注意的是,该函数也是有缺省值的,如果()里不给数,那默认就是0

resize():

既然capacity可以提前指定,那么size也是可以提前指定的

string s;
s.resize(100);
cout << "size:" << s.size() << endl << "capacity:" << s.capacity() << endl;
cout << s << endl;

 

可以看到size直接是100了,capacity也跟着增容了,但为什么最后输出s确是空的呢?

可以看到resize有两个重载,我们刚才使用的就是第一种方式,第二种方式后面需要跟一个字符

string s;
s.resize(100,'A');
cout << "size:" << s.size() << endl << "capacity:" << s.capacity() << endl;
cout << s << endl;

 这次我给了resize第2个参数'A',可以看到成功的输出了100个A,如果不给默认就是'\0'。也就是说,如果直接resize(100)的话,就是存了100个'\0'在s里面

下面这段代码会输出什么?

string s("Apex Legends");
s.resize(5);
cout << "size:" << s.size() << endl;
cout << s << endl;
s.resize(15,'S');
cout << "size:" << s.size() << endl;
cout << s << endl;

可以看到,如果resize的值比原来size要小,就会把多余的删掉

如果本来字符串中有值,resize了一个更大的空间,原来的值也会保留。

插入与删除:

string里也可以和别的数据结构一样插入和删除

这是string的插入接口函数,可以看到一共有6个重载一个模板,但实际只需要记住两种用法就可以了

string s("Apex Legends");
s.insert(4, "Rainbow");//在下标为4的地方插入"Rainbow"(只能插入字符串)
cout << s << endl;
s.insert(s.begin(), 'L');//在最前面插入一个字符'L'(只能插入单个字符)
cout << s << endl;
s.insert(5, "Zelda", 3);//在下标为5的地方插入"Zelda"的前3个字符(只能插入字符串)(了解即可)
cout << s << endl;

string s("Apex Legends");
s.erase(2, 3);//在下标为2的地方删除3个字符
cout << s << endl;
s.erase(2);//如果不给第2个参数,缺省值是npos,也就是把下标为2以后的字符都删除
cout << s << endl;

第一个erase上两个参数都有缺省值,如果第2个参数不给,就代表删除从pos开始的所有字符,如果第1个参数也不给,就代表删除整个字符串

c_str:

string其实和C语言中的字符串还是不一样的,我们来看下面代码

string s1("Hello ");
s1+='\0';
s1+="World";
cout << s1 << endl;
cout << s1.c_str() << endl;

可以看到在给s1初始化为Hello了之后,又给后面加了\0World,那这个时候输出的结果是

Hello World
Hello

第一行输出的是完整的这就是c_str的作用了,可以将string转换成c语言类型的字符串进行输出,即char*,而C语言的字符串是以\0作为结束标志,所以只会输出到Hello,而cout会输出string类中的全部字符,所以\0后面的也会输出

find()和substr:

顾名思义,是用来找字符的,返回的是该字符所在的下标 ,如果没有找到,就返回npos(string能表示的最大字符长度)

string s1("text.cpp");
string s2("string.c");
string s3("string.txt");

如果现在让你分别输出这三个字符串中的文件格式后缀,就可以先用find()找到.所在的位置,然后再输出.以及以后的字符

那怎么样输出.以及以后的字符呢

substr()就可以输出子串, 第一个参数是定义从下标多少开始输出,第二个参数则是定义输出多少个

string s1("text.cpp");
string s2("string.c");
string s3("string.txt");
size_t pos1 = s1.find('.');
if(pos1 != string::npos)//先确保找到了,再输出cout << s1.substr(pos1) << endl;
size_t pos2 = s2.find('.');
if(pos2 != string::npos)cout << s2.substr(pos2) << endl;
size_t pos3 = s3.find('.');
if(pos3 != string::npos)cout << s3.substr(pos3) << endl;

那如果是text.cpp.rar这种呢?要怎么找到rar而不是cpp.rar?

这时候就要拿出另外一个函数了

rfind也就是reverse_find的意思,就是从后往前找

string s1("text.cpp.rar");
string s2("string.c.txt");
string s3("string.txt.c");
size_t pos1 = s1.rfind('.');
if(pos1 != string::npos)//先确保找到了,再输出cout << s1.substr(pos1) << endl;
size_t pos2 = s2.rfind('.');
if(pos2 != string::npos)cout << s2.substr(pos2) << endl;
size_t pos3 = s3.rfind('.');
if(pos3 != string::npos)cout << s3.substr(pos3) << endl;

把之前的find换成rfind就可以了

string url("https://cplusplus.com/reference/string/string/rfind/");

现在需要把这个url的协议,域名和资源名称分别分离出来换行输出,就可以用到上面学到的find和substr来完成 

string url("https://cplusplus.com/reference/string/string/rfind/");
size_t pos1 = url.find(':');
if(pos1 != string::npos)cout << url.substr(0,pos1) << endl;//输出协议
size_t pos2 = url.find('/',pos1+3);
if(pos2 != string::npos)cout << url.substr(pos1+3,pos2-(pos1+3)) << endl;//输出域名
cout << url.substr(pos2+1);//输出资源名称

getline():

 

在讲getline之前,我们先来看一下这道题

int main()
{string s1;cin >> s1;int pos = s1.rfind(' ');//总后往前找空格,就能找到最后一个单词的开头//如果只输入了一个单词,rfind找不到空格,就会返回-1(npos的值)cout << s1.size()-(pos+1);//pos+1就是截止到最后一个空格时的长度(pos=-1时也适用)return 0;
}

 乍一看没什么问题,但当程序运行起来,如果只输入了一个单词,那结果还是可以正常输出的,但只要是输入了超过一个单词的字符串,不管怎么样,它输出的长度都是第一个单词的长度,这是怎么回事?

在C语言里,我们都知道scanf在输入时是以空格,tab或enter作为结束符,cin其实也一样,所以在输入了第一个单词并且空格后,后面的单词就没有意义了。

在C语言中要想解决这个问题,一般都会用gets(已经被废除)或fgets,在C++中则是用getline,它在输入时只会以换行符作为结束标志

int main()
{string s1;getline(cin,s1);int pos = s1.rfind(' ');//总后往前找空格,就能找到最后一个单词的开头//如果只输入了一个单词,rfind找不到空格,就会返回-1(npos的值)cout << s1.size()-(pos+1);//pos+1就是截止到最后一个空格时的长度(pos=-1时也适用)return 0;
}

 只需要把第二行的cin换成getline这种格式,就可以读取空格了

相关文章:

【语法】C++的string

目录 4个默认成员函数 迭代器 string的扩容&#xff1a; capacity(): reserve(): resize()&#xff1a; 插入与删除&#xff1a; c_str: find()和substr: getline(): 在C语言中&#xff0c;要想存储一串字符&#xff0c;往往用的都是char arr[]&#xff0c;也就是字…...

支持selenium的chrome driver更新到133.0.6943.141

最近chrome释放新版本&#xff1a;133.0.6943.141 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…...

【2025.2.25更新】wordpress免费AI插件,文章内容、图片自动生成、视频自动生成、网站AI客服、批量采集文章,内置deepseek联网满血版

wordpress免费AI插件&#xff0c;文章内容、文章图片、长尾关键词、视频自动生成、网站AI客服、批量采集文章&#xff0c;插件已接入腾讯云大模型知识引擎xDeepSeek&#xff0c;基于腾讯云大模型知识引擎xDeepSeek可联网满血版&#xff0c;插件可实现文章生成、长尾关键词生成、…...

KylinSP3 | 防火墙和麒麟安全增强设置KySec

一、系统防火墙原理 麒麟操作系统从V10版本开始&#xff0c;默认使用了Firewalld防火墙&#xff0c;Firewalld是能提供动态管理的防火墙&#xff0c;支持网络/防火墙区域&#xff0c;用于定义网络连接或接口的信任级别。支持IPv4和IPv6防火墙设置、以太网桥接和IP集。将运行时…...

DeepSeek + Higress AI 网关/Spring AI Alibaba 案例征集

诚挚地感谢每一位持续关注并使用 Higress 和 Spring AI Alibaba 的朋友。我们会持续投入&#xff0c;力图把 Higress 变得更好&#xff0c;把 Higress 和 Spring AI Alibaba 社区和生态变得更加繁荣。 关于 Higress&#xff1a; Higress 除了作为云原生网关支持 Web 应用的部…...

sql server笔记

创建数据库 use master gocreate database stuuuuu//删除数据库if db_id ($$$) is not nullDrop database [$$$] go//新建表USE [studyTest] GOSET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOCREATE TABLE [dbo].[Table_1]([id] [int] NULL,[name] [varchar](10) NULL ) ON…...

Vue 3 搭建前端模板并集成 Ant Design Vue(2025)

一、环境安装 截止2025.2.6 &#xff0c;官网发布的vue 3 稳定版本是 V 3.5.13 根据此时的官方文档要求&#xff0c;node 版本需要大于等于 V 18.3 于是使用 nvm 安装 v 20.18.0 二、创建项目 使用 Vue 官方推荐的脚手架 create-vue 快速创建 Vue3 的项目: 快速上手 | Vue.js…...

Word表格中如何只单独调整某一单元格宽度

大家好&#xff0c;我是小鱼。 在日常制作Word表格时&#xff0c;表格中不同单元格有时需要设置不同的宽度&#xff0c;但是很多小伙伴会发现想单独调整某一个单元格宽度时&#xff0c;发现其它单元格宽度也会发生变化。那么&#xff0c;到底怎么才能单独调整某一单元格宽度呢…...

CSS基础选择器和文字属性控制

CSS 层叠样式表(Cascading Style Sheets)&#xff0c;是一种样式表语言&#xff0c;它和HTML一起被用来描述网页的样式。HTML 主要用来定义网页的内容&#xff0c;也就是骨架&#xff0c;CSS 用来定义网页的样式。 CSS 是由选择器和属性声明组成的。选择器用来选择元素&#…...

保护密码等敏感信息的几个常用方法

概述 在生产环境&#xff0c;保护数据库账号密码等敏感信息是至关重要的&#xff0c;这些信息不能被所有研发工程师看见&#xff0c;本文介绍几种避免明文存储的常用方法。 方法1&#xff1a; 使用配置中心加密 适用场景&#xff1a;已采用配置中心&#xff08;如Spring Clou…...

【Golang 面试题】每日 3 题(六十七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

JavaScript系列(89)--前端模块化工程详解

前端模块化工程详解 &#x1f9e9; 前端模块化是现代Web开发的核心理念之一&#xff0c;它帮助我们组织和管理日益复杂的前端代码。本文将详细探讨前端模块化工程的各个方面&#xff0c;从基础概念到实际应用。 模块化概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;模…...

PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 TIFF

TIFF文件是高质量图像的首选。它们广泛用于印刷、存档和图形设计。企业通常需要转换PDF文档以获得更好的兼容性。了解如何以编程方式执行此转换可以节省时间和资源。在这篇教程中&#xff0c;我们将探讨如何使用 Python 将 PDF 转换为 TIFF。 本文涵盖以下主题&#xff1a; P…...

【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)

本文项目编号 T 219 &#xff0c;文末自助获取源码 \color{red}{T219&#xff0c;文末自助获取源码} T219&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,加密压缩,带有压缩进度

前言 最近在做项目时遇到一个需求&#xff0c;需要将升级的文件压缩成zip&#xff0c;再进行传输&#xff1b; 通过网络调研&#xff0c;有许多方式可以实现&#xff0c;例如QT私有模块的ZipReader、QZipWriter&#xff1b;或者第三方库zlib或者libzip或者quazip等&#xff1…...

【GO】学习笔记

目录 学习链接 开发环境 开发工具 GVM - GO多版本部署 GOPATH 与 go.mod go常用命令 环境初始化 编译与运行 GDB -- GNU 调试器 基本语法与字符类型 关键字与标识符 格式化占位符 基本语法 初始值&零值&默认值 变量声明与赋值 _ 下划线的用法 字…...

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

官方网站 官方网址&#xff1a;etcd 二进制包下载&#xff1a;Install | etcd GitHub社区项目&#xff1a;etcd-io GitHub GitHub社区项目版本历史&#xff1a;Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...

港科大提出开放全曲音乐生成基础模型YuE:可将歌词转换成完整歌曲

YuE是港科大提出的一个开源的音乐生成基础模型&#xff0c;专为音乐生成而设计&#xff0c;专门用于将歌词转换成完整的歌曲&#xff08;lyrics2song&#xff09;。它可以生成一首完整的歌曲&#xff0c;时长几分钟&#xff0c;包括朗朗上口的声乐曲目和伴奏曲目。YuE 能够模拟…...

Hive从入门到运用

hive简介 hive的设计思想&#xff08;本质是一个翻译器&#xff09; 上传安装包 解压&#xff0c;查看 运行hive&#xff08;一定要启动hadoop&#xff0c;是有依赖关系的。&#xff09; 测试启动方法&#xff0c;和建表 文件创建很上传到hdfs&#xff0c;直接上传到hive表的目…...

unity学习55:按钮 button

目录 1 按钮 button 1.1 按钮button 其实就是一个组合体 1.2 测试按钮&#xff0c;在UI中添加1个按钮 1.3 按钮的属性 2 按钮的图片属性 3 按钮的变换 transition 3.1 按颜色变换 3.2 按图片精灵变换 3.3 按动画变换 4 按钮的导航 5 按钮的事件和脚本 1 按钮 …...

《论基于构件的软件开发方法及其应用》审题技巧 - 系统架构设计师

软考论文写作框架&#xff1a;基于构件的软件开发方法及其应用 一、考点概述 本论题“基于构件的软件开发方法及其应用”主要考察的是软件工程专业中关于基于构件开发&#xff08;CBSD&#xff09;的深入理解与实践应用。考点涵盖以下几个方面&#xff1a; 首先&#xff0c;…...

穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路

回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...

java23种设计模式-命令模式

命令模式&#xff08;Command Pattern&#xff09;学习笔记 1. 模式定义 行为型设计模式&#xff0c;将请求封装为对象&#xff0c;使请求的发送者与接收者解耦。支持请求的排队、记录、撤销/重做等操作。 2. 适用场景 ✅ 需要将操作参数化 ✅ 需要支持事务操作&#xff08…...

交流异步电动机PI双闭环SVPWM矢量控制Simulink

关注微♥“电机小子程高兴的MATLAB小屋”获取专属优惠 1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.仿真算法&#xff1a; (…...

利用 Open3D 保存并载入相机视角的简单示例

1. 前言 在使用 Open3D 进行三维可视化和点云处理时&#xff0c;有时需要将当前的视角&#xff08;Camera Viewpoint&#xff09;保存下来&#xff0c;以便下次再次打开时能够还原到同样的视角。本文将演示如何在最新的 Open3D GUI 界面&#xff08;o3d.visualization.gui / o…...

kiln微调大模型-使用deepseek R1去训练一个你的具备推理能力的chatGPT 4o

前言 随着deepseek的爆火&#xff0c;对于LLM的各种内容也逐渐步入我的视野&#xff0c;我个人认为&#xff0c;可能未来很长一段时间&#xff0c;AI将持续爆火&#xff0c;进入一段时间的井喷期&#xff0c;AI也会慢慢的走入我们每个家庭之中&#xff0c;为我们的生活提供便利…...

《从Kokoro看开源语音模型的“无限可能”》:此文为AI自动生成

开源语音模型 Kokoro 是一款轻量级、高性能的文本转语音(TTS)模型,以下是关于它的详细介绍: 核心优势 卓越的音质:即使参数规模仅 8200 万,也能生成自然流畅、富有表现力的语音。轻量高效:占用资源少,运行速度快,在 CPU 上即可实现近乎实时的语音生成,在 GPU 端则能…...

Spring 事务和事务传播机制(详解)

1 .事务 1.1.什么是事务&#xff1f; 事务是一组操作的集合,是不可分割的操作 事务作为一个整体&#xff0c;要不同时完成&#xff0c;要不同时失败 1.2什么时候需要事务&#xff1f; 关于金钱的操作基本都会有事务 例如转账操作&#xff1a; 第一步 A账号 - 500元第二步 B账…...

Innodb MVCC实现原理

什么是MVCC? MVCC全称多版本并发控制&#xff0c;是在并发访问数据库时对操作数据做多版本管理&#xff0c;避免因为写数据时要加写锁而阻塞读取数据的请求问题。 Innodb对mvcc的实现 1、事务版本号 每次事务开启前都会从数据库获得一个自增长的事务ID&#xff0c;可以从事…...

【网络编程】网络套接字和使用案例

一、为什么大多数网络编程使用套接字 在网络编程中&#xff0c;套接字 (socket) 是最常用的接口&#xff0c;但并不是所有的底层通信都依赖于套接字。尽管如此&#xff0c;绝大多数网络应用&#xff08;特别是在操作系统层面&#xff09;都使用套接字进行通信&#xff0c;因为…...

【Java企业生态系统的演进】从单体J2EE到云原生微服务

Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进&#xff1a;从原始Java到Spring Cloud2.1 原始Java阶段&#xff08;1995-1999&#xff09;2.2 J2EE阶段&#x…...

【爬虫基础】第二部分 爬虫基础理论 P1/3

上节内容回顾&#xff1a;【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 爬虫相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff…...

第2章_保护您的第一个应用程序

第2章_保护您的第一个应用程序 在本章中&#xff0c;您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣&#xff0c;您将运行的示例应用程序由两部分组成&#xff0c;前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证&#xff0…...

山东大学软件学院人工智能导论实验之知识库推理

目录 实验目的&#xff1a; 实验代码&#xff1a; 实验内容&#xff1a; 实验结果 实验目的&#xff1a; 输入相应的条件&#xff0c;根据知识库推理得出相应的知识。 实验代码&#xff1a; def find_data(input_process_data_list):for epoch, data_process in enumerat…...

Java 网络协议面试题答案整理,最新面试题

TCP和UDP的主要区别是什么&#xff1f; TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;的主要区别在于TCP是面向连接的协议&#xff0c;而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。 1、连接…...

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后&#xff0c;安装的时候没选择其他硬盘&#xff0c;虚拟磁盘也在c盘会占用很大的空间&#xff0c;像我的就三十多个G&#xff0c;把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...

AOP进阶-02.通知顺序

一.通知顺序 当有多个切面类中的切入点表达式一样时&#xff0c;这些切面类的执行顺序是怎样的呢&#xff1f;如图我们将定义两个切面类&#xff0c;一个MyAspect2&#xff0c;一个MyAspect3&#xff0c;一个MyAspect4。执行后我们发现&#xff0c; 对于目标方法前的通知方法&…...

${sym} 与 String(sym) 的区别

在 JavaScript 中&#xff0c;${sym}&#xff08;模板字符串插值&#xff09;和 String(sym)&#xff08;显式类型转换&#xff09;虽然都涉及将值转换为字符串&#xff0c;但它们的底层逻辑和行为存在显著差异&#xff0c;尤其是在处理 Symbol 等特殊类型时。以下是具体对比&a…...

sglang框架源码笔记

文章目录 整体架构1. **客户端&#xff08;Client&#xff09;**&#xff1a;2. **服务器端&#xff08;Server&#xff09;**&#xff1a;3. **调度器与模型工作节点&#xff08;Scheduler & Model Worker&#xff09;**&#xff1a; TpModelWorker类ModelRunner类TpModel…...

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法&#xff08;Chaotic Evolution Optimization, CEO&#xff09;是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…...

uake 网络安全 reverse网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文首发于“合天网安实验室” 首先从PEID的算法分析插件来介绍&#xff0c;要知道不管是在CTF竞赛的REVERSE题目中&#xff0c;还是在实际的商业产品中&#xf…...

C语言实现单链表

单链表是数据结构中最基础的链式结构,它不按照线性的顺序存储数据,而是由若干个同一结构类型的“节点”依次串联而成的,即每一个节点里保存着下一个节点的地址(指针)。 上图中,一个表头变量head是用来存储链表首节点的地址,链表中每个节点有data(数据)部分和n…...

Rk3568驱动开发_点亮led灯代码完善(手动挡)_6

1.实现思路&#xff1a; 应用层打开设备后通过write函数向内核中写值&#xff0c;1代表要打开灯&#xff0c;0代表要关闭灯 Linux配置gpio和控制gpio多了一个虚拟内存映射操作 2.注意事项&#xff1a; 配置和读写操作的时候要谨慎&#xff0c;比如先关掉gpio再注销掉虚拟内存…...

threejs:document.createElement创建标签后css设置失效

vue3threejs&#xff0c;做一个给模型批量CSS2D标签的案例&#xff0c;在导入模型的js文件里&#xff0c;跟着课程写的代码如下&#xff1a; import * as THREE from three; // 引入gltf模型加载库GLTFLoader.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.…...

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…...

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通过编写提示词&#xff0c;辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多&#xff0c;流量分析的需求多种多样&#xff0c;…...

Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合

概述 实时目标检测对于许多实际应用来说已经变得至关重要&#xff0c;而Ultralytics公司开发的YOLO&#xff08;You Only Look Once&#xff0c;只看一次&#xff09;系列一直是最先进的模型系列&#xff0c;在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...

一个行为类似标准库find算法的模板

函数需要两个模板类型参数&#xff0c;一个表示函数的迭代器参数&#xff0c;另一个表示值的类型。 代码 #include<iostream> #include<string> #include<vector> #include<list>using namespace std;template <typename IterType,typename T>…...

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…...