C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析
博主将从C++标准库中的
std::string
出发,详细探讨字符串的处理方法,涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string
的使用展开,结合代码示例进行说明。
一、std::string
的基本操作
1.1 创建与初始化
std::string
提供了多种构造函数,支持从C风格字符串、字符数组、字符列表等初始化。
示例:
#include <iostream>
#include <string>int main() {// 默认构造函数std::string s1;// 从C风格字符串初始化std::string s2 = "Hello, World!";// 从字符数组初始化char arr[] = {'H', 'i', '\0'};std::string s3(arr);// 重复字符初始化std::string s4(5, 'A'); // "AAAAA"std::cout << "s2: " << s2 << std::endl;std::cout << "s4: " << s4 << std::endl;return 0;
}
输出:
s2: Hello, World!
s4: AAAAA
1.2 字符串的访问与修改
std::string
提供了多种访问和修改字符串内容的方法。
示例:
#include <iostream>
#include <string>int main() {std::string s = "Hello";// 访问字符char c = s[0]; // 'H'char c2 = s.at(1); // 'e'// 修改字符s[0] = 'h'; // "hello"s.at(1) = 'E'; // "hEllo"// 添加字符s += ", World!"; // "hEllo, World!"// 插入字符s.insert(5, " C++"); // "hEllo C++, World!"// 删除字符s.erase(5, 4); // "hEllo, World!"std::cout << s << std::endl;return 0;
}
输出:
hEllo, World!
1.3 字符串的比较
std::string
支持通过 ==
、!=
、<
、>
等运算符进行比较。
示例:
#include <iostream>
#include <string>int main() {std::string s1 = "apple";std::string s2 = "banana";if (s1 == s2) {std::cout << "s1 and s2 are equal" << std::endl;} else if (s1 < s2) {std::cout << "s1 is less than s2" << std::endl;} else {std::cout << "s1 is greater than s2" << std::endl;}return 0;
}
输出:
s1 is less than s2
二、字符串的查找与替换
2.1 查找子字符串
std::string
提供了 find()
和 rfind()
方法,分别用于查找子字符串的首次和最后一次出现位置。
示例:
#include <iostream>
#include <string>int main() {std::string s = "Hello, World! Hello, C++!";// 查找子字符串size_t pos = s.find("Hello");if (pos != std::string::npos) {std::cout << "Found 'Hello' at position: " << pos << std::endl;}// 从后向前查找size_t rpos = s.rfind("Hello");if (rpos != std::string::npos) {std::cout << "Last 'Hello' found at position: " << rpos << std::endl;}return 0;
}
输出:
Found 'Hello' at position: 0
Last 'Hello' found at position: 14
2.2 替换子字符串
std::string
提供了 replace()
方法,用于替换指定位置的子字符串。
示例:
#include <iostream>
#include <string>int main() {std::string s = "Hello, World!";// 替换子字符串s.replace(7, 5, "C++"); // "Hello, C++!"std::cout << s << std::endl;return 0;
}
输出:
Hello, C++!
三、字符串的分割与连接
3.1 分割字符串
C++标准库没有直接提供字符串分割函数,但可以通过 find()
和 substr()
实现。
示例:
#include <iostream>
#include <string>
#include <vector>std::vector<std::string> split(const std::string& s, char delimiter) {std::vector<std::string> tokens;size_t start = 0;size_t end = s.find(delimiter);while (end != std::string::npos) {tokens.push_back(s.substr(start, end - start));start = end + 1;end = s.find(delimiter, start);}tokens.push_back(s.substr(start));return tokens;
}int main() {std::string s = "apple,banana,orange";std::vector<std::string> fruits = split(s, ',');for (const auto& fruit : fruits) {std::cout << fruit << std::endl;}return 0;
}
输出:
apple
banana
orange
3.2 连接字符串
std::string
支持通过 +
或 append()
方法连接字符串。
示例:
#include <iostream>
#include <string>int main() {std::string s1 = "Hello";std::string s2 = "World";// 使用 + 连接std::string s3 = s1 + ", " + s2 + "!";// 使用 append() 连接s1.append(", ").append(s2).append("!");std::cout << s3 << std::endl;std::cout << s1 << std::endl;return 0;
}
输出:
Hello, World!
Hello, World!
四、字符串的性能优化
4.1 预分配内存
通过 reserve()
方法预分配内存,减少频繁扩容的开销。
示例:
#include <iostream>
#include <string>int main() {std::string s;s.reserve(100); // 预分配100字节内存for (int i = 0; i < 100; ++i) {s += 'a';}std::cout << "Length: " << s.length() << std::endl;std::cout << "Capacity: " << s.capacity() << std::endl;return 0;
}
输出:
Length: 100
Capacity: 100
4.2 使用 std::string_view
(C++17)
std::string_view
提供零拷贝的字符串访问,适合只读操作。
示例:
#include <iostream>
#include <string>
#include <string_view>void print(std::string_view sv) {std::cout << sv << std::endl;
}int main() {std::string s = "Hello, World!";print(s); // 无需拷贝print("Literal"); // 直接处理字面量return 0;
}
输出:
Hello, World!
Literal
五、实际应用场景
5.1 配置文件解析
使用字符串分割和查找功能解析配置文件。
示例:
# config.ini
name=John
age=30
#include <iostream>
#include <string>
#include <fstream>
#include <unordered_map>std::unordered_map<std::string, std::string> parse_config(const std::string& filename) {std::unordered_map<std::string, std::string> config;std::ifstream file(filename);std::string line;while (std::getline(file, line)) {size_t pos = line.find('=');if (pos != std::string::npos) {std::string key = line.substr(0, pos);std::string value = line.substr(pos + 1);config[key] = value;}}return config;
}int main() {auto config = parse_config("config.ini");std::cout << "Name: " << config["name"] << std::endl;std::cout << "Age: " << config["age"] << std::endl;return 0;
}
输出:
Name: John
Age: 30
六、总结
std::string
是C++中处理字符串的核心工具,提供了丰富的操作方法。通过合理使用这些方法,可以高效地完成字符串的创建、修改、查找、分割和连接等任务。在实际开发中,结合性能优化技巧(如预分配内存、使用 std::string_view
),可以进一步提升程序的效率。
相关文章:
C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析
博主将从C标准库中的 std::string 出发,详细探讨字符串的处理方法,涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string 的使用展开,结合代码示例进行说明。 一、std::string 的基本操作 1.1 创建与初始化 std::string 提供了…...

JVM类加载过程详解:从字节码到内存的蜕变之旅
一、类加载的意义与整体流程 在Java中,每一个.java文件经过编译都会生成.class字节码文件。但字节码本身并不能直接运行,必须通过 类加载(Class Loading)将其转化为JVM内存中的数据结构,才能被程序调用。 类加载过程就…...
【力扣Hot100详解】解锁“字母异位词分组”:用排序魔法一键通关力扣!
字母异位词分组,力扣第49题,看似是“找不同”的排列游戏,实则是哈希表与字符串处理的经典结合。这道题就像是一把钥匙,能帮你打开“如何高效归类数据”的算法大门。今天,我们就用 Java 带你用“排序魔法”轻松破解它&a…...

vite配置scss全局变量
vite配置scss全局变量 创建单独文件variable.scss在其中定义变量 vite.config.ts中配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vite.dev/config/ export default defineConfig({plugins: [vue()],resolve:…...
Spring Boot01(注解、)---java八股
Spring Boot中常用注解及其底层实现 1、SpringBootApplication注解: SpringBootApplication注解:这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解是: aSpringBootConfiguration:…...

2.19学习记录
Web easyupload3.0 这是一道构造.htaccess文件的传马 如下: <FilesMatch "jpg">SetHandler application/x-httpd-php </FilesMatch>.htaccess文件可以作为一个解释器,可以将传进去的图片马改为php马上传之后再传个图片马&#…...

汽车免拆诊断案例 | 2013 款奔驰 S300L 车起步时车身明显抖动
故障现象 一辆2013款奔驰S300L车,搭载272 946发动机,累计行驶里程约为15万km。车主反映,将挡位置于D挡,稍微释放一点制动踏板,车辆蠕动时车身明显抖动,类似气缸失火时的抖动,又类似手动变速器…...

【HeadFirst系列之HeadFirst设计模式】第5天之工厂模式:比萨店的秘密武器,轻松搞定对象创建!
工厂模式:比萨店的秘密武器,轻松搞定对象创建! 大家好,今天我们来聊聊设计模式中的工厂模式。如果你曾经为对象的创建感到头疼,或者觉得代码中到处都是 new 关键字,那么工厂模式就是你的救星!本…...
Redis如何解决热Key问题
目录 **如何解决 Redis 的热 Key(Hot Key)问题?****解决方案** **1. 使用多级缓存****方案** **2. 进行 Key 预分片(Key Sharding)****方案** **3. 使用 Redis 复制机制(主从复制或集群)****方案…...

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用
嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下,传统的视频观看方式依赖于微软的OCX控件,然而OCX控件的使用正面临越来越多的挑战: 首先,用户需要安装浏览器插件、调整浏览器安全级别,并允许ActiveX控件弹出…...
Zookeeper(58)如何在Zookeeper中实现分布式锁?
在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务,使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例,展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...

Mac端homebrew安装配置
拷打了一下午o3-mini-high,不如这位博主的超强帖子,10分钟结束战斗 跟随该文章即可,2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次,点赞258次,收藏837次。一直觉得自己写…...
Spring 接入 DeepSeek
引入依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency>2.yml配置 spring:ai:openai:api-key: sk-xxxxx // 填写自己申请的keybase-url: http…...
vscode将文件中行尾默认CRLF改为LF
安装prettier npm install --save-dev --save-exact prettier执行命令 npx prettier --write --end-of-line lf .即可将项目中的所有文件行尾序列格式改为lf *在你使用git拉取代码的时候,git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...

python-leetcode 33.排序链表
题目: 给定链表的头结点head,请将其按升序排列,并返回排序后的链表 方法一:自顶向下归并排序 链表自顶向下归并排序的过程: 1.找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以…...

【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...

基于微信小程序的民宿短租系统设计与实现(ssm论文源码调试讲解)
第4章 系统设计 4.1系统设计的目标 系统设计的目标是满足用户的需求和满足系统实现所需要的所有要求。本系统收集了信息浏览、信息删除、信息添加、信息修改、信息查询为一体[17]。改变了用户民宿短租的方式,提高管理员管理效率以及用户预订的效率。为用户、房主提…...
使用 Jetty 构建 HTTPS 服务入门指南
在互联网安全越来越重要的今天,使用 HTTPS 为 Web 服务提供安全传输成为标准配置。Jetty 是一个高性能、易用且功能丰富的开源 Java HTTP 服务器和 Servlet 容器,能够轻松实现 HTTPS 支持。本文将结合代码实例,引导您快速搭建一个基于 Jetty 的 HTTPS 服务。 一、Jetty 简介…...
数据结构《图》
数据结构《图论》 图的性质 一、无向图(Undirected Graph) 定义 由一组顶点(Vertex)和一组无向边(Edge)构成。 每条无向边用一条无方向的线段连接两个顶点,记为 ( (u, v) ),其中…...

用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...