淮阴区建设局网站/外包公司和劳务派遣的区别
🤖🌟 欢迎降临张有志的未来科技实验室🤖🌟
专栏:C++
👨💻👩💻 先赞后看,已成习惯👨💻👩💻
👨💻👩💻 创作不易,多多支持👨💻👩💻
🚀 启动创新引擎,揭秘C++的密码🚀
引言
- 编程中字符串至关重要。无论是构建用户界面、处理数据还是网络通信,都离不开字符串操作。
- C 语言里的 char 数组处理字符串时,需手动管理内存,容易出现缓冲区溢出等错误,像字符串拼接、复制等常见操作,代码编写繁琐且易出错。
- C++ 的 string 类则是强大的字符串处理工具。它能自动处理内存分配与释放,避免手动管理的风险。还提供大量实用成员函数,如拼接、查找、替换、比较等操作都很便捷,可有效提升开发效率,助力开发者专注核心业务逻辑,在 C++ 编程里处理字符串极为得力。
💡目录
引言
一、string 类基础
string 类对象的创建及初始化
二、string 类基本操作
(一)字符串访问
(二)字符串长度获取
(三)字符串拼接
(四) 探讨拼接时的内存管理与性能优化( reserve( ) 方法的应用)
(五)空字符串的判断
三、string类对象的比较
1.==、>、<、!= 等运算符在 string 类中的应用
2. compare() 方法的深入讲解,包括返回值含义与多参数用法
区分大小写与不区分大小写比较的实现方式及应用场景
区分大小写比较
不区分大小写比较
string常用成员函数编辑
一、string 类基础
C++ 标准库(Standard Template Library, STL)是 C++ 的核心组成部分之一,提供了丰富的数据结构和算法。
<string>
是 C++ 标准库中用于处理字符串的头文件。在 C++ 中,字符串是由字符组成的序列。
<string>
头文件提供了std::string
类,它是对 C 风格字符串的封装,提供了更安全、更易用的字符串操作功能。
想要使用string类,需包含头文件string与iostream:
#include<iostream>
#include<string>
string 类对象的创建及初始化
1. 直接赋值初始化
#include<iostream>
#include<string>int main(){std::string str1 = "Hello, World!";std::cout << str1 << std::endl;return 0;
}
2.默认构造函数
#include <iostream>
#include <string>int main() {std::string str2;std::cout << "str2的长度为: " << str2.length() << std::endl;return 0;
}
3.指定长度初始化
#include <iostream>
#include <string>int main() {std::string str4(10, 'a');std::cout << str4 << std::endl;return 0;
}
二、string 类基本操作
(一)字符串访问
1.下标访问
#include <iostream>
#include <string>int main() {std::string str = "Hello";char firstChar = str[0]; // 获取字符串的第一个字符 'H'std::cout << "第一个字符: " << firstChar << std::endl;// 也可以修改单个字符str[0] = 'J';std::cout << "修改后的字符串: " << str << std::endl;return 0;
}
2.迭代器遍历
#include <iostream>
#include <string>int main() {std::string str = "World";std::string::iterator it;for (it = str.begin(); it!= str.end(); ++it) {std::cout << *it;}std::cout << std::endl;return 0;
}
string
类提供了 begin()和end()
函数分别返回指向字符串开头和结尾(不包含最后一个字符)的迭代器- 可以使用常量迭代器
const_iterator
来遍历不可修改的字符串,以增强程序的安全性和规范性。
(二)字符串长度获取
1. length()
与 size()
方法的使用及区别
string
类中的 length()
和 size()
方法在功能上基本相同,都用于获取字符串中字符的数量,并返回 size_t 类型。
#include <iostream>
#include <string>int main() {std::string str = "Test String";std::cout << "字符串长度(length): " << str.length() << std::endl;std::cout << "字符串长度(size): " << str.size() << std::endl;return 0;
}
2. 获取字符串长度并应用于实际逻辑
#include <iostream>
#include <string>int main() {std::string password;std::cout << "请输入密码: ";std::cin >> password;if (password.length() < 8) {std::cout << "密码长度不足 8 位,请重新输入。" << std::endl;// 可以在这里进行重新输入密码等相关逻辑处理} else {std::cout << "密码长度符合要求。" << std::endl;}return 0;
}
(三)字符串拼接
1. 使用 + 运算符拼接字符串
#include <iostream>
#include <string>int main() {std::string firstName = "John";std::string lastName = "Doe";std::string fullName = firstName + " " + lastName;std::cout << "全名: " << fullName << std::endl;return 0;
}
2. append( ) 函数
#include <iostream>
#include <string>int main() {std::string str1 = "Hello";std::string str2 = " World";std::string str3 = "!";// 拼接一个字符串str1.append(str2);// 拼接一个字符串的一部分str1.append(str3, 0, 1);std::cout << str1 << std::endl;return 0;
}
这里先将 str2 拼接到 str1 后面,然后将 str3 的从索引 0 开始长度为 1 的部分(即
'!'
)拼接到 str1 上。
(四) 探讨拼接时的内存管理与性能优化( reserve( ) 方法的应用)
当进行多次字符串拼接时,如果不加以优化,可能会导致频繁的内存重新分配,降低程序性能
#include <iostream>
#include <string>int main() {std::string result;for (int i = 0; i < 1000; ++i) {std::string temp = std::to_string(i);result += temp;}std::cout << result << std::endl;return 0;
}
每次执行 result += temp
时,string
对象可能会重新分配内存来容纳新拼接的内容。为了避免这种情况,可以使用 reserve()
方法预先分配足够的内存空间
#include <iostream>
#include <string>int main() {std::string result;int estimatedLength = 0;for (int i = 0; i < 1000; ++i) {std::string temp = std::to_string(i);estimatedLength += temp.length();}result.reserve(estimatedLength);for (int i = 0; i < 1000; ++i) {std::string temp = std::to_string(i);result += temp;}std::cout << result << std::endl;return 0;
}
首先预估字符串的长度并提前开辟空间,以此来避免多次开辟空间降低效率
#include <iostream>
#include <string>
#include <ctime>// 未优化的多次字符串拼接函数
void withoutReserve() {std::string result;for (int i = 0; i < 1000; ++i) {std::string temp = std::to_string(i);result += temp;}
}// 使用reserve优化后的多次字符串拼接函数
void withReserve() {std::string result;int estimatedLength = 0;for (int i = 0; i < 1000; ++i) {std::string temp = std::to_string(i);estimatedLength += temp.length();}result.reserve(estimatedLength);for (int i = 0; i < 1000; ++i) {std::string temp = std::to_string(i);result += temp;}
}int main() {clock_t start1, end1, start2, end2;// 测量未优化代码的执行时间start1 = clock();withoutReserve();end1 = clock();// 测量优化后代码的执行时间start2 = clock();withReserve();end2 = clock();double time1 = static_cast<double>(end1 - start1) / CLOCKS_PER_SEC;double time2 = static_cast<double>(end2 - start2) / CLOCKS_PER_SEC;std::cout << "未使用reserve的代码执行时间: " << time1 << " 秒" << std::endl;std::cout << "使用reserve的代码执行时间: " << time2 << " 秒" << std::endl;return 0;
}
使用reserve()函数后,效率明显提高(在数据较大时)
(五)空字符串的判断
1. 使用empty()
函数
std::string strToCheck = "";
if (strToCheck.empty()) {std::cout << "这是一个空字符串。" << std::endl;
}
2.比较长度
std::string anotherStrToCheck;
if (anotherStrToCheck.length() == 0) {std::cout << "这个字符串长度为0,是一个空字符串。" << std::endl;
}
三、string类对象的比较
1.==、>、<、!= 等运算符在 string 类中的应用
#include <iostream>
#include <string>int main() {std::string str1 = "apple";std::string str2 = "banana";std::string str3 = "apple";if (str1 == str3) {std::cout << "str1 和 str3 相等" << std::endl;}if (str1!= str2) {std::cout << "str1 和 str2 不相等" << std::endl;}return 0;
}
2. compare()
方法的深入讲解,包括返回值含义与多参数用法
compare( ) 的基本用法是将当前字符串与另一个字符串进行比较,返回值为一个整数,其含义如下:
- 如果当前字符串小于比较的字符串,返回值小于 0
- 如果当前字符串等于比较的字符串,返回值等于 0
- 如果当前字符串大于比较的字符串,返回值大于 0
#include <iostream>
#include <string>// 函数用于比较两个完整字符串
void compareFullStrings() {std::string strX = "hello";std::string strY = "world";int result = strX.compare(strY);if (result < 0) {std::cout << "strX 小于 strY" << std::endl;}
}// 函数用于从指定位置和长度比较字符串与子串
void compareSubstring() {std::string longStr = "This is a long string";std::string subStr = "long";// 从索引10开始比较,比较长度为4int posResult = longStr.compare(10, 4, subStr);if (posResult == 0) {std::cout << "从索引10开始的子串与subStr相等" << std::endl;}
}int main() {std::cout << "比较两个完整字符串的结果:" << std::endl;compareFullStrings();std::cout << "比较指定位置子串的结果:" << std::endl;compareSubstring();return 0;
}
区分大小写与不区分大小写比较的实现方式及应用场景
区分大小写比较
如前面所述,使用比较运算符(> == < != )和compare方法都是区分大小写的比较。这种比较方式在很多场景下是适用的,比如密码验证(包括大小写)才能通过验证
#include <iostream>
#include <string>int main() {std::string storedPassword = "Abc123";std::string inputPassword;std::cout << "请输入密码: ";std::cin >> inputPassword;if (inputPassword == storedPassword) {std::cout << "密码正确" << std::endl;} else {std::cout << "密码错误" << std::endl;}return 0;
}
不区分大小写比较
在一些场景中,例如文件名比较或者文本搜索时,可能不需要区分大小写。实现不区分大小写比较可以通过将字符串转换为统一的大小写形式后再进行比较。例如,可以使用 transform
函数结合 tolower
或 toupper
函数来实现。以下是一个不区分大小写比较两个字符串的示例
#include <iostream>
#include <algorithm>
#include <string>bool caseInsensitiveCompare(const std::string& str1, const std::string& str2) {std::string str1Copy = str1;std::string str2Copy = str2;std::transform(str1Copy.begin(), str1Copy.end(), str1Copy.begin(), [](unsigned char c) { return std::tolower(c); });std::transform(str2Copy.begin(), str2Copy.end(), str2Copy.begin(), [](unsigned char c) { return std::tolower(c); });return str1Copy == str2Copy;
}int main() {std::string file1 = "TEST.TXT";std::string file2 = "test.txt";if (caseInsensitiveCompare(file1, file2)) {std::cout << "文件名不区分大小写比较相等" << std::endl;} else {std::cout << "文件名不区分大小写比较不相等" << std::endl;}return 0;
}
string常用成员函数
相关文章:

C++ 中的 string 类:全面解析与应用实践(上)
🤖🌟 欢迎降临张有志的未来科技实验室🤖🌟 专栏:C 👨💻👩💻 先赞后看,已成习惯👨💻👩💻…...

量化交易系统开发-实时行情自动化交易-8.7.文华平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于文华平台介绍。 文华财经…...

美畅物联丨如何通过 FFmpeg 解码视频
FFmpeg是一款功能强大、在多媒体处理领域广泛应用的开源工具。它可以处理多种音频和视频格式,包含编码、解码、转码、流媒体处理等众多功能。前两天,我们在《美畅物联丨如何通过FFmpeg排查视频问题》一文中介绍了借助FFmpeg程序来辅助判断视频播放异常的…...

机器学习任务功略
loss如果大,训练资料没有学好,此时有两个可能: 1.model bias太过简单(找不到loss低的function)。 解决办法:增加输入的feacture,设一个更大的model,也可以用deep learning增加弹性…...

Web Worker 和 WebSocket的区别
Web Worker(消息传递机制) 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程&a…...

JMeter实时性能压测可视化系统整合
一、相关工具简介: JMeter、Grafana 和 InfluxDB 结合实时地收集、分析和展示性能测试数据,进行更好地理解系统的性能表现,及时发现潜在问题并进行优化。 1,JMeter 实时生成性能数据,并将其发送到 InfluxDB 进行存储。2,InfluxDB 存储的数据。3,通过Grafana的仪表板,用…...

无限加载和懒加载及路由滚动及路由滚动不生效
这里写目录标题 列表无限加载懒加载定制路由滚动使用scrollBehavior不起效不管用的原因使用scrollTo来实现路由滚动elMain && elMain.scrollTo(...) 的作用是: 无限加载和懒加载的区别 列表无限加载 无限加载功能在现代网页和移动应用中广泛应用࿰…...

CSS底层基础:小白速来
1. CSS简介 CSS (Cascading Style Sheets) 是一种用来描述HTML或XML文档样式的语言。它使得开发者能够控制网页的布局和外观,包括字体、颜色、间距等。CSS通过选择器来指定要应用样式的元素,并定义这些元素的具体样式属性。 基本结构示例: …...

【MySQL 进阶之路】索引概述
第06章_索引 1.什么是索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查…...

【C++boost::asio网络编程】有关异步读写api的笔记
异步读写api 异步写操作async_write_someasync_send 异步读操作async_read_someasync_receive 定义一个Session类,主要是为了服务端专门为客户端服务创建的管理类 class Session { public:Session(std::shared_ptr<asio::ip::tcp::socket> socket);void Conn…...

Elasticsearch 的存储与查询
Elasticsearch 的存储与查询 在搜索系统领域,数据的存储与查询是两个最基础且至关重要的环节。Elasticsearch(ES) 在这两方面进行了深度优化,使其在关系型数据库或非关系型数据库中脱颖而出,成为搜索系统的首选。 映射 (Mapping) 映射 (Ma…...

008静态路由-特定主机路由
按照如上配置,用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1,再经过R2 …...

SystemUI 下拉框 Build 版本信息去掉
需求及场景 去掉SystemUI 下拉框 Build 版本信息 如下图所示:去掉 12 (SP1A.201812.016) 了解 去掉之前我们先了解它是个什么东西:其实就是一个Build RTM 信息显示 Android_12_build_SP1A.210812.016 修改文件 /frameworks/base/packages/Syste…...

【JS】栈内存、堆内存、事件机制区别、深拷贝、浅拷贝
js中,内存主要分为两种类型:栈内存(stack)、堆内存(heap),两种内存区域在存储和管理数据时有各自的特点和用途。 栈内存 访问顺序 栈是先进后出、后进先出的数据结构,栈内存是内存用…...

如何确保Java爬虫获得1688商品详情数据的准确性
在数字化商业时代,数据的价值日益凸显,尤其是对于电商平台而言。1688作为中国领先的B2B电子商务平台,提供了海量的商品数据接口,这些数据对于市场分析、库存管理、价格策略制定等商业活动至关重要。本文将详细介绍如何使用Java编写…...

【蓝牙通讯】iOS蓝牙开发基础介绍
1. iOS 蓝牙开发基础 在 iOS 中,蓝牙的操作主要是通过 Core Bluetooth 框架来实现。理解 Core Bluetooth 的基本组件和工作原理是学习 iOS 蓝牙开发的第一步。 核心知识点: Core Bluetooth 框架:这是 iOS 系统提供的专门用于蓝牙低功耗&am…...

Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)
目录 前言 在开发过程中,我们经常遇到一些看似简单的问题,但有时正是这些细节问题让我们头疼不已。今天,我就来和大家分享一个我在开发过程中遇到的 el-switch 使用的小坑,希望大家在使用时能够避免。 一. 问题背景 二. 问题分…...

echarts的双X轴,父级居中的相关配置
前言:折腾了一个星期,在最后一天中午,都快要放弃了,后来坚持下来,才有下面结果。 这个效果就相当是复合表头,第一行是子级,第二行是父级。 子级是奇数个时,父级label居中很简单&…...

RuoYi-Vue部署到Linux服务器(Jar+Nginx)
一、本地环境准备 源码下载、本地Jdk及Node.js环境安装,参考以下文章。 附:RuoYi-Vue下载与运行 二、服务器环境准备 1.安装Jdk 附:JDK8下载安装与配置环境变量(linux) 2.安装MySQL 附:MySQL8免安装版下载安装与配置(linux) 3.安装Redis 附:Redis下载安装与配置(…...

Linux firewalld常用命令
启动防火墙 systemctl start firewalld 停止防火墙 systemctl stop firewalld 防火墙开机自启动 systemctl enable firewalld 禁止防火墙开机自启动 systemctl disable firewalld 检查防火墙的状态 systemctl status firewalld 重新加载防火墙的配置 firewall-cmd -…...

Vue 组件之间的通信方式
Vue.js 中组件之间的通信是构建复杂应用的关键部分。以下是一些常见的Vue组件通信方式: 1. Props 和 Emit(父子组件通信) Props:父组件通过props向子组件传递数据。Emit:子组件通过emit触发事件,向父组件…...

el-select 修改样式
这样漂亮的页面,搭配的却是一个白色风格的下拉框 ,这也过于刺眼。。。 调整后样式为: 灯红酒绿总有人看着眼杂,但将风格统一终究是上上选择。下面来处理这个问题。 分为两部分。 第一部分:是修改触发框的样式 第二部…...

Java项目实战II基于微信小程序的亿家旺生鲜云订单零售系统的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互联网技术的不断…...

算法训练营day27(回溯算法03:组合总和,组合总和2,分割回文串)
第七章 回溯算法part03● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串详细布置 39. 组合总和 本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E…...

【青牛科技】D8331 流量计电路芯片,兼容 CTs,电阻分流器和罗氏线圈传感器
概述: D8331 系列超低功耗混合信号处理器由多种设备组成,具有针对电能表应用的不 同外围设备。它们集成了模拟前端和固定功能 DSP 解决方案与一个增强型 8052 单片 机核心,RTC 和 LCD 驱动程序集成在一个单一部件中。测量内核包括有功、无功…...

R语言森林生态系统结构、功能与稳定性分析与可视化实践高级应用
在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...

【IntelliJ IDEA 中 Run Dashboard 不显示端口号问题解决办法】
IntelliJ IDEA 中 Run Dashboard 不显示端口号问题解决办法 解决 IntelliJ IDEA Run Dashboard 不显示端口号问题方法一:删除临时文件方法二:设置启动参数方法三:编辑 Run/Debug Configurations方法四:检查端口占用情况方法五&…...

idea中git的将A分支某次提交记录合并到B分支
一 实操案例 1.1 背景描述 在开发过程中,有时候需要将A分支某次提交记录功能合并到B分支上。主要原理用到git的cherry pick功能。 1.2 案例 实现的功能: master分支的11.24提交记录合并到feature_A分支; 1.master分支提交的记录 2.fea…...

华为关键词覆盖应用市场ASO优化覆盖技巧
在我国的消费者群体当中,华为的品牌形象较高,且产品质量过硬,因此用户基数也大。与此同时,随着影响力的增大,华为不断向外扩张,也逐渐成为了海外市场的香饽饽。作为开发者和运营者,我们要认识到…...

蓝桥杯第 23 场 小白入门赛
一、前言 好久没打蓝桥杯官网上的比赛了,回来感受一下,这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …...