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

【C++】string

个人主页:NiKo 

C++专栏:C++程序设计

目录

一、标准库中的string类

二、string的遍历

三、string容量

四、string修改


一、标准库中的string类

1、string类

        C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。 

        在使用string类时,必须包含#include头文件以及using namespace std;

#include <string>
using namespace std;

2、string的构造方法

string一共有5种构造方法。

  • string()
  • 无参构造,初始化为空串
​string str1;                   //空串

  • string(const string& str)
  •  用str拷贝构造

string str2("hello world");   //用"hello world"拷贝构造str2

  • string(size_t n,char c)
  • 用n个字符c初始化
string str3(4, 'a');          //用4个字符'a'初始化

  • string(const char* s,size_t n)
  • 用字符串s的前n个字符初始化
string str4("hello world", 5);     //用字符串"hello world" 前5个字符初始化

  • string(const string& str,size_t pos,size_t len=npos)
  • 将字符串str,从下标pos位置开始,选取长度为len个的字符,来初始化
  • 注:上面的缺省值npos,定义为:size_t npos=-1. npos为最大值,表示不传参数时,会用str中pos位置开始后的所有字符来初始化
string str5(str2, 5, 6); //用str2中,从下标为5位置开始,长度为6的字符串初始化

二、string的遍历

1、auto和范围for(C++11支持)

补充auto的相关语法:

        1、在早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

int a = 10;
auto b = a;
auto c = 'a';
auto d = func1(); //auto会自动推导变量的类型auto e; // 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
(必须初始化)cout << typeid(b).name() << endl;    //int
cout << typeid(c).name() << endl;    //char
cout << typeid(d).name() << endl;    //int

        2、用auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加&;当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

int x = 10;
auto y = &x;
auto* z = &x;    //用auto声明指针类型时,用auto和auto*没有任何区别
auto& m = x;     //用auto声明引用类型时则必须加&cout << typeid(x).name() << endl;    //int
cout << typeid(y).name() << endl;    //int*
cout << typeid(z).name() << endl;    //int*auto aa = 1, bb = 2;//当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错auto cc = 3, dd = 4.0;// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型

        3、auto不能作为函数的参数,可以做返回值,但是建议谨慎使用

// 不能做参数 error:报错
void func2(auto a)
{}// 可以做返回值,但是建议谨慎使用(建议不要使用)
auto func3()
{return 3;
}

        4、auto不能直接用来声明数组

// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
auto array[] = { 4, 5, 6 };

        5、auto的用武之地
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();

范围for:

        对于一个有范围的集合 而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的 for 循环。 for 循环后的括号由冒号 分为两部分:第一部分是范围 内用于迭代的变量,第二部分则表示被迭代的范围 ,自动迭代,自动取数据,自动判断结束。范围for 可以作用到数组和容器对象上进行遍历。
int array[] = { 1, 2, 3, 4, 5 };
// C++98的遍历
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
{cout << array[i] << endl; // 1 2 3 4 5
}// C++11的遍历
for (auto& e : array)e *= 2;    // 如果要修改容器内的元素,需要在变量类型后加上&
for (auto e : array)cout << e << " " << endl; // 2 4 6 8 10// 字符串的遍历
string str("hello world");
for (auto ch : str)
{cout << ch << " "; // h e l l o  w o r l d
}
cout << endl;

2、迭代器(iterator)

  • string 中的迭代器主要分为正向迭代器反向迭代器,其中又可以细分为 const 和 非const类型的,共计四种。
  • const迭代器仅定义方式与非const不同,且在循环内部不能对元素进行修改,其余的都相同
begin + end
begin 获取第一个字符的迭代器 + end 获取最后一个字符下一个位 置的迭代器('\0')
rbegin + rend
rend 获取第一个字符的前一个位置迭代器 + rbegin获取最后一个字符下一个位置的迭代器

正向迭代器

  • 非const
string str("hello world");/*
* 步骤:1.获取容器开头的迭代器2.以容器结尾的迭代器作为循环结束条件3.通过*(迭代器变量名)获取容器内部的元素4.移动迭代器的位置
*/// 或 auto sit = str.begin(); 
string::iterator sit = str.begin();	// 1
while (sit != str.end()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

  • const
string::const_iterator sit = str.begin();	// 1
while (sit != str.end()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

反向迭代器

  • 非const
string str("hello world");
/*
* 步骤:1.获取容器结尾的迭代器(rbegin)2.以容器开头的迭代器作为循环结束条件(rend)3.通过*(迭代器变量名)获取容器内部的元素4.移动迭代器的位置
*/
string::reverse_iterator sit = str.rbegin();	// 1
while (sit != str.rend()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

  • const
string::const_reverse_iterator sit = str.rbegin();	// 1
while (sit != str.rend()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

3、operator[]

  • 通过索引访问类中的字符数据
MyString str("Hello, World!");
str[0] = 'h'; // 修改第一个字符为'h'
str[7] = 'w'; // 修改第八个字符为'w'(将'W'改为小写)// 输出修改后的字符串
for (size_t i = 0; i < str.getLength(); ++i) {cout << str[i];
}cout << endl;    // hello world

三、string容量

1、length和size

  • 返回字符串中有效字符的长度
  • size()与length()方法底层实现原理完全相同,二者没有本质的区别,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
string str("hello world");
cout << "str length:" << str.length() << endl;
cout << "str size:" << str.size() << endl;//str length:11
//str size:11

2、capacity

  • 返回字符串存储有效字符的空间大小(不包含'\0')
string str("hello world");
cout << "str capacity:" << str.capacity() << endl;//str capacity:15(不包含'\0')
  • capacity的扩容机制

        capacity()在不同平台上的扩容方式不同。先展示Windows下capacity的扩容过程。

string s;
size_t sz = s.capacity();			// 记录最开始的容量
cout << "make s grow:" << endl;
cout << "init capacity:" << s.capacity() << endl;
for (int i = 0; i < 100; i++) {s.push_back('c');				// 每次向s中添加一个字符if (sz != s.capacity()) {sz = s.capacity();			// 判断容量是否变化并打印信息cout << "capacity changed:" << sz << endl;}
}/*
Windows result:make s grow:      (不包含'\0')        (包含'\0')init capacity:        15                 16capacity changed:     31                 32   capacity changed:     47                 48   capacity changed:     70                 71   capacity changed:     105                106运行环境:Windows11 VS2022
*/

        在Windows系统上,使用Visual Studio 2022编译器时,容器的capacity首次扩容遵循二倍增长策略(例如,从16扩展到32),而随后的扩容则调整为1.5倍增长。

        相比之下,在Linux系统上,当采用g++ 4.8编译器且演示代码保持完全一致的情况下,容器的初始capacity被设置为1,并且无论是首次还是后续的扩容操作,均严格遵循二倍增长模式。

/*
Linux result:make s grow:init capacity:        1                 capacity changed:     2                   capacity changed:     4                   capacity changed:     8                   capacity changed:     16capacity changed:     32capacity changed:     64capacity changed:     128                                    运行环境:Linux g++ 4.8
*/

3、reserve

  • 用于预分配足够的内存空间以容纳指定数量的字符。这个函数不会改变字符串的内容或长度,但它可以影响字符串的 capacity
string s;
s.reserve(100);                     // 提前扩容100个空间(不包含'\0')
size_t sz = s.capacity();			// 记录最开始的容量
cout << "make s grow:" << endl;
cout << "init capacity:" << s.capacity() << endl;
for (int i = 0; i < 100; i++) {s.push_back('c');				// 每次向s中添加一个字符if (sz != s.capacity()) {sz = s.capacity();			// 判断容量是否变化并打印信息cout << "capacity changed:" << sz << endl;}
}/*
Windows VS result:make s grow:init capacity:111Linux g++ result:make s grow:init capacity:100
*/

        reserve()函数在字符串管理中的主要作用是预分配足够的内存空间,以减少因后续操作(如添加字符)导致的频繁扩容,从而提升性能。这一功能在不同平台上可能因标准库实现的具体细节而有所差异。

        在Visual Studio环境下,当传入的参数n大于字符串当前的容量时,reserve()函数会确保字符串的容量增加至至少n个字符或更大。如果n小于或等于当前容量,调用reserve(n)通常不会有任何效果,因为字符串已经有足够的空间来存储n个字符。

        在Linux平台上,使用g++等编译器时,reserve()函数的行为通常与Visual Studio相似。当n大于当前容量时,它会将字符串的容量调整为至少n个字符。然而,与Visual Studio不同的是,在Linux平台上,如果n小于或等于当前容量,字符串的容量将会缩减(至少为size)。

四、string修改

1、push_back

  • void push_back (char c);
  • 在字符串的末尾添加一个字符
string myString = "Hello";
myString.push_back('!'); // 在字符串末尾添

2、append

  • ​​​​​​string& append (const string& str);
  • ​在字符串的末尾添加另一个字符串的内容
string myString = "Hello, ";
string appendedString = "world!";
myString.append(appendedString); // 在 myString 末尾添加 appendedString 的内容

3、operator+=

  • string& operator+= (const string& str);
  • 将右侧字符串的内容追加到左侧字符串的末尾
string greeting = "Hello";
string suffix = ", world!";
greeting += suffix; // 使用 += 运算符将 suffix 追加到 greeting 的末尾

 4、insert

  • string& insert (size_t pos, const string& str);
  • 在字符串的指定位置插入另一个字符串的内容
string myString = "Hello world";
string toInsert = ", beautiful ";
myString.insert(6, toInsert); // 在 myString 的第 6 个位置插入 toInsert 的内容

5、erase

  • string& erase (size_t pos = 0, size_t len = npos);
  • 从字符串中删除字符
string str = "Hello, World!";
str.erase(7, 5); // 从下标7开始删除5个字符

6、find 

  • size_t find (const string& str, size_t pos = 0)
  • 在string中查找字符并返回指定字符串的下标(如果找不到则会返回-1
string st1("babbabab");
// 若省略第2个参数,则默认从位置0(即第1个字符)起开始查找
cout << st1.find('a') << endl;   //1
cout << st1.find('a', 0) << endl;//1
cout << st1.find('a', 1) << endl;//1   
cout << st1.find('a', 2) << endl;//4// 找不到
if(str1.find('a') == -1) cout << "cannot find from str1";

相关文章:

【C++】string

个人主页&#xff1a;NiKo C专栏&#xff1a;C程序设计 目录 一、标准库中的string类 二、string的遍历 三、string容量 四、string修改 一、标准库中的string类 1、string类 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;…...

在 RK3588 多线程推理 YOLO 时,同时开启硬件解码和 RGA 加速的性能分析

一、前言 本文是基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计项目的延申与拓展&#xff0c;单独分析所提出的方案4的性能和加速原理&#xff0c;即同时开启 RKmpp 硬件视频解码和 RGA 硬件图像缩放、旋转。 二、实验结果回顾 在项目的总览篇中&#xff0c;给出了该方案…...

sqli-labs靶场 less 8

文章目录 sqli-labs靶场less 8 布尔盲注 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…...

3.2 列表的常见函数

1.列表的常用函数 -如何查看一个不认识的内容 -help() -查看官方帮助文档 -dir&#xff08;&#xff09; -查看内部函数 -随机数语句 import randomranom.randint(0,101) 随机生成0-100内的数字 list1 [1,2,3,4,5]list2 list([1,2,3,4,5,])list2 list("wang…...

Apache Doris 高频问题排查指南:从报错到性能优化

一、部署与配置问题 1. FE启动失败&#xff1a;Address already in use ERROR: fe.journal.Catalog constructor exception. port9010 is already used. 原因&#xff1a;端口被占用或残留进程未释放 解决&#xff1a; # 查找占用进程 lsof -i :9010 # 终止残留进程 kill…...

Hadoop/Spark 生态

Hadoop/Spark 生态是大数据处理的核心技术体系&#xff0c;专为解决海量数据的存储、计算和分析问题而设计。以下从底层原理到核心组件详细讲解&#xff0c;帮助你快速建立知识框架&#xff01; 一、为什么需要 Hadoop/Spark&#xff1f; ​传统单机瓶颈&#xff1a; 数据量超…...

51单片机的五类指令(二)——算术运算类指令

目录 一、加法指令 &#xff08;一&#xff09;不带进位加法指令&#xff08;ADD&#xff09; &#xff08;二&#xff09;带进位加法指令&#xff08;ADDC&#xff09; &#xff08;三&#xff09;加 1 指令&#xff08;INC&#xff09; &#xff08;四&#xff09;十进制…...

uniapp选择文件使用formData格式提交数据

1. Vue实现 在vue项目中,我们有个文件,和一些其他字段数据需要提交的时候,我们都是使用axios 设置请求头中的Content-Type: multipart/form-data,然后new FormData的方式来进行提交。方式如下: const sendRequest = () => {const formData = new FormData()formData…...

mac Python多版本第三方库的安装路径

终端查看python版本是 3.12&#xff0c;但是pycharm使用的python版本是 3.9 终端正常安装包以后&#xff0c;pycharm都可以正常使用&#xff0c;但是将 pycharm的python换成 3.12 版本&#xff0c;之前安装的库都没有了 通过终端查看安装库的位置&#xff0c;确实是安装到py…...

第 26 场 蓝桥月赛 部分题解

第 26 场 蓝桥月赛 2.灯笼猜谜3.元宵分配4.摆放汤圆5.元宵交友&#xff08;运行超时 通过90%&#xff09; 2.灯笼猜谜 分析&#xff1a;以当前位置为视角&#xff0c;要想移动的距离尽可能的少&#xff0c;按顺序猜谜语&#xff0c;给你一个区间&#xff0c;有三种情况&#xf…...

【Vue3知识】Vue3集成富文本编辑器TinyMCE

Vue3集成富文本编辑器TinyMce 集成一、安装依赖二、基础集成示例1. 组件封装&#xff1a;RichEditor.vue 三、关键配置说明1. **API Key 配置**2. **图片上传处理**3. **多语言支持** 四、完整本地化部署步骤&#xff08;无 API Key&#xff09;五、在父组件中使用六、常见问题…...

pod生命周期

1.init容器&#xff1a;做主容器运行前需要做的准备条件 2.探针 通俗易懂就是检测容器是否正常运行工作 启动探针startupProbe&#xff1a;检测应用是否完成启动 &#xff0c;如果启动则禁用其他探测 直到成功为止&#xff0c;探测失败则杀死容器&#xff0c;容器服从重启策略…...

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>

游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制&#xff0c;它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 &#xff08;一&#xff09;显式游标 【一】不带参数&#xff0c;普通的显示游标 1. 显式…...

OLLAMA 未授权访问-漏洞挖掘

1.漏洞描述 Ollama存在未授权访问漏洞。由于Ollama默认未设置身份验证和访问控制功能&#xff0c;未经授权的攻击者可在远程条件下调用Ollama服务接口&#xff0c;执行包括但不限于敏感模型资产窃取、虚假信息投喂、模型计算资源滥用和拒绝服务、系统配置篡改和扩大利用等恶意…...

多线程—线程安全集合类与死锁

上篇文章&#xff1a; 多线程—JUChttps://blog.csdn.net/sniper_fandc/article/details/146713322?fromshareblogdetail&sharetypeblogdetail&sharerId146713322&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 线程安全的集合类 …...

【鸿蒙5.0】鸿蒙登录界面 web嵌入(隐私页面加载)

在鸿蒙应用中嵌入 Web 页面并加载隐私页面&#xff0c;可借助 WebView 组件来实现。以下是一个完整示例&#xff0c;展示如何在鸿蒙 ArkTS 里嵌入 Web 页面并加载隐私政策页面。 在 HarmonyOS 应用开发中&#xff0c;如果你希望嵌入一个网页&#xff0c;并且特别关注隐私页面加…...

C++轻量HeaderOnly的JSON库

文章目录 1 nlohmann/json库说明2 nlohmann/json特点3 nlohmann/json库的使用方法3.1 引入头文件3.2 解析JSON字符串3.3 访问JSON数据3.4 生成JSON对象3.5 修改JSON数据3.6 将JSON写入文件3.7 遍历JSON对象 4 代码示例4.1 定义JSON数值类型4.2 从STL容器转换到json4.3 string序…...

打包python文件生成exe

下载PyInstaller 官网 pip install pyinstaller验证是否安装成功 pyinstaller --version打包 pyinstaller "C:\Documents and Settings\project\myscript.py"会生成.spec,build,dist三项&#xff0c;其中build,dist为文件夹&#xff0c;dist是最后的可执行文件&a…...

Nginx — Nginx安装证书模块(配置HTTPS和TCPS)

一、安装和编译证书模块 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…...

《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…...

Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清

Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清 文章目录 Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清一、介绍二、效果三、下载 一、介绍 Dynamic Wallpaper for mac版&#xff0c;是一款4K超高清动态壁纸软件&#xff0c;告别单调的静态壁纸&#xff0c;拥抱活泼的动态壁纸…...

MySQL8.4 NDB Cluster 集群配置安装

文章目录 前置条件安装步骤环境准备下载 安装 RPM 包安装 NDB 组件与常见错误配置节点启用节点配置启动 MySQL 集群验证集群状态 关于 ndb_mgm集群管理备份与恢复集群配置管理日志相关 MySQL NDB Cluster 是一个分布式数据库解决方案&#xff0c;提供高可用性、数据分片和自动故…...

多线程开发中List的使用

由于ArrayList在多线程高并发情况下是不安全的&#xff0c;因此要慎用&#xff0c;那么此时如果涉及到集合操作&#xff0c;应该怎么选&#xff1a; 方案一&#xff1a;Vector: 特点&#xff1a;通过给所有方法都用 synchronized 修饰从而保证线程安全&#xff0c; 缺点&…...

Html 页面图标的展示列表

Html 页面中经常需要使用网页图标&#xff0c;这些图标的样式和名称都不容易记住。常用的网页图标展示页面链接记录如下&#xff1a; Material Design Icons 图标库 - FontAwesome 字体图标中文Icon...

Vue实现动态路由的后端控制

在传统开发后台管理系统时&#xff0c;都会涉及权限控制这一功能需求 即&#xff1a;根据不同登录的角色账号来使用该账号拥有的功能&#xff0c;也就是说系统左边的菜单栏不是固定不变的。 首先是基础路由配置带有component的。 const allRoutes [// 基础路由{path: /,name…...

​AI训练中的专有名词大白话版

​AI训练中的专有名词大白话版 ​1. 数据集&#xff08;Dataset&#xff09;​ &#x1f449; ​人话&#xff1a;AI的“练习题题库”&#xff0c;包含一堆带答案的题目&#xff08;比如猫狗照片标签&#xff09;。 &#x1f539; ​例子&#xff1a; 训练集&#xff08;练习…...

kafka 与 RocketMQ对比

问题 1: 为什么使用消息队列?服务搭建KafkaRocketMQ编写 docker-compose.yml运行docker compose修改配置文件(解决网络问题)创建一个 topic运行skd尝试发送与接收功能 压力测试:Kafkabatch-size(批量大小)分区数:发送数据(MB/s)消费-线程数(15 分区) RocketMQ生产生产者数量批…...

instnatid模型加载器放在哪里

一般根据节点名称来放&#xff0c;如果没有就新建 ComfyUI\models\instantid...

Spring Boot自动配置原理解析

文章目录 前言一、SpringBootConfiguration二、EnableAutoConfiguration2.1、AutoConfigurationPackage2.2、Import(AutoConfigurationImportSelector.class) 三、ComponentScan四、自动配置源码4.1、获取所有候选的自动配置类4.2、过滤不满足条件的自动配置 总结 前言 在常规的…...

LlamaIndex实现(基于PDF|CSV文件)RAG检索增强生成:NaiveRAG

什么是 RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合 信息检索&#xff08;Retrieval&#xff09; 和 文本生成&#xff08;Generation&#xff09; 的AI技术&#xff0c;用于提升大语言模型&#xff08;L…...

分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)

仅供自学回顾使用&#xff0c;请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁&#xff0c;在本人其他文章中也有涉及。 《JUC&#xff1a;三、两阶段终止模式、死锁的jconsole检测、乐观锁&#xff08;版本号机制CAS实现&#xff09;悲观锁》&#xff1a;https://blog.…...

vue3搭建实战项目笔记三

vue3搭建实战项目笔记三 3.1.行高偏移问题3.2.谷歌浏览器上不能定位3.2.2 移动端css隐藏滚动条 3.3.获取列表的数据3.3.1 服务器返回十万条数据3.3.2 分页展示数据3.3.2 防止展示数据为空报错 3.4.上拉加载数据3.4.1 加载更多数据3.4.2 监听页面滚动到底部3.4.3 监听滚动的时机…...

【商城实战(101)】电商未来已来:新技术引领商城发展新航向

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...

深入解析最大公约数(GCD)与最小公倍数(LCM)的C++实现

深入解析最大公约数&#xff08;GCD&#xff09;与最小公倍数&#xff08;LCM&#xff09;的C实现 一、GCD与LCM的数学定义 1. 最大公约数&#xff08;GCD&#xff09; 两个或多个整数共有约数中最大的一个。 例如&#xff1a; GCD(12, 18) 6GCD(21, 14) 7 2. 最小公倍数…...

低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战‌

在远程资产追踪、野外环境监测等场景中&#xff0c;稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 ‌原生双UART接口 USB OTG扩展能力‌ &#xff0c;可无缝集成主流LPWAN模组&#xff08;LoRa/NB-IoT&#xff09;&#xff0c;实现“数据采集-边…...

【质量管理】纠正、纠正措施和预防的区别与解决问题的四重境界

“质量的定义就是符合要求”&#xff0c;我们在文章【质量管理】人们对于质量的五个错误观念-CSDN博客中提到过&#xff0c;这也是质量大师克劳士比所说的。“质量的系统就是预防”&#xff0c;防止出现产品不良而造成的质量损失。 质量问题的解决可以从微观和宏观两个方面来考…...

STM32F103_LL库+寄存器学习笔记12 - 提高串口通讯程序的健壮性:异常监控 + 超时保护机制

导言 首先&#xff0c;进行USART和DMA状态监测、记录异常状态并主动处理&#xff0c;是高健壮性嵌入式系统开发的核心思想之一。 这种机制看似复杂&#xff0c;实则能有效保障系统长期、稳定地运行&#xff1a; 提升通讯可靠性。降低维护成本。增强系统自恢复能力。 因此&…...

搜索-BFS

马上蓝桥杯了&#xff0c;最近刷了广搜&#xff0c;感觉挺有意思的&#xff0c;广搜题类型都差不多&#xff0c;模板也一样&#xff0c;大家写的时候可以直接套模板 这里给大家讲一个比较经典的广搜题-迷宫 题目问问能否走到 (n,m) 位置&#xff0c;假设最后一个点是我们的&…...

Keil调试(RTT Debug 断点)

调试 打印操作 方式接口优缺点串口打印TXRX简单,但是占用串口,速度慢,重定向fputc简单RTT打印SWDIOSWCLK速度快,不占额外接口,直接移植RTT库断点打印SWDIOSWCLKDebug的时候断点操作SWOSWDIOSWCLKSWO需要连接SWO引脚,重定向fputc简单 这里我只介绍RTT打印和断点打印; 一. RT…...

【jQuery】插件

目录 一、 jQuery插件 1. 瀑布流插件&#xff1a; jQuery 之家 http://www.htmleaf.com/ 2. 图片懒加载&#xff1a; jQuery 插件库 http://www.jq22.com/ 3. 全屏滚动 总结不易~ 本章节对我有很大收获&#xff0c;希望对你也是~~~ 一、 jQuery插件 jQuery 功能…...

leetcode 28 Find the Index of the First Occurrence in a String

直接用kmp算法 class Solution { public:int strStr(string haystack, string needle) {return kmp(haystack,needle);}int kmp(std::string &text,std::string &pattern){int n text.size();int m pattern.size();if(m 0)return 0;std::vector<int> next;ne…...

nginx 动静分离

一.动静分离 1.动静分离的好处 Apache Tocmat 严格来说是一款java EE服务器&#xff0c;主要是用来处理 servlet请求。处理css、js、图片这些静态文件的IO性能不够好&#xff0c;因此&#xff0c;将静态文件交给nginx处理&#xff0c;可以提高系统的访问速度&#xff0c;减少…...

1.2 斐波那契数列模型:LeetCode 面试题 08.01. 三步问题

动态规划解三步问题&#xff1a;LeetCode 面试题 08.01. 三步问题 1. 题目链接 LeetCode 面试题 08.01. 三步问题 题目要求&#xff1a;小孩上楼梯&#xff0c;每次可以走1、2或3步&#xff0c;计算到达第 n 阶台阶的不同方式数&#xff0c;结果需对 1e9 7 取模。 2. 题目描述…...

关于AutoMapper

AutoMapper 概述 AutoMapper 是一个基于约定的对象 - 对象映射库&#xff0c;主要用于在不同对象类型之间自动映射属性值。它能根据配置的映射规则&#xff0c;将源对象的属性值填充到目标对象中&#xff0c;避免了手动编写大量繁琐的对象映射代码。 作用 提升开发效率&…...

是否每一层之间都要线性变换和激活函数?

1. 神经网络层的基本组成 一个典型的神经网络层通常包含两个步骤&#xff1a; 线性变换&#xff08;加权求和&#xff09;&#xff1a; z Wx} b 其中W 是权重矩阵&#xff0c;b是偏置向量&#xff0c;是输入&#xff0c;z 是线性输出。激活函数&#xff1a; 其中&#xff0c…...

golang 的reflect包的常用方法

目录 reflect 包方法总结 类型 (Type) 方法 值 (Value) 方法 代码示例&#xff1a; reflect 包方法总结 p : Person{Name: "小明", Age: 22}t : reflect.TypeOf(&p)v : reflect.ValueOf(p) 类型 (Type) 方法 方法名描述示例               Na…...

CentOS 7 安装 EMQX (MQTT)

CentOS 7 安装 EMQX 通过 Yum 源安装 EMQX 支持通过 Yum 源安装&#xff0c;您可通过以下 Yum 命令从中自动下载和安装 EMQX。 通过以下命令配置 EMQX Yum 源&#xff1a; curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash安装以下依赖项&#xff…...

Flask项目部署:Flask + uWSGI + Nginx

目录 1,网络架构 2,环境安装 2.1,安装yum:Shell软件包管理器 2.2 安装python 2.3 安装uWSGI 2.4 安装Flask 3,上传工程包到服务器,打包Flask项目 4,创建和配置 uwsgi 配置文件 uwsgi.ini 4.1配置文件 4.2配置文件注释详解 5,启动服务 6,安装nginx 7,nginx配置 8,…...

软件工程面试题(十五)

1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…...

当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系

《当Kafka化身抽水马桶&#xff1a;论组件并发提升与系统可用性的量子纠缠关系》 引言&#xff1a;一场OOM引发的血案 某个月黑风高的夜晚&#xff0c;监控系统突然发出刺耳的警报——我们的数据发现流水线集体扑街。事后复盘发现&#xff1a;Kafka集群、Gateway、Discovery服…...