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

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 出发&#xff0c;详细探讨字符串的处理方法&#xff0c;涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string 的使用展开&#xff0c;结合代码示例进行说明。 一、std::string 的基本操作 1.1 创建与初始化 std::string 提供了…...

JVM类加载过程详解:从字节码到内存的蜕变之旅

一、类加载的意义与整体流程 在Java中&#xff0c;每一个.java文件经过编译都会生成.class字节码文件。但字节码本身并不能直接运行&#xff0c;必须通过 类加载&#xff08;Class Loading&#xff09;将其转化为JVM内存中的数据结构&#xff0c;才能被程序调用。 类加载过程就…...

【力扣Hot100详解】解锁“字母异位词分组”:用排序魔法一键通关力扣!

字母异位词分组&#xff0c;力扣第49题&#xff0c;看似是“找不同”的排列游戏&#xff0c;实则是哈希表与字符串处理的经典结合。这道题就像是一把钥匙&#xff0c;能帮你打开“如何高效归类数据”的算法大门。今天&#xff0c;我们就用 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注解&#xff1a; SpringBootApplication注解&#xff1a;这个注解标识了一个SpringBoot工程&#xff0c;它实际上是另外三个注解的组合&#xff0c;这三个注解是&#xff1a; aSpringBootConfiguration&#xff1a…...

2.19学习记录

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

汽车免拆诊断案例 | 2013 款奔驰 S300L 车起步时车身明显抖动

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

【HeadFirst系列之HeadFirst设计模式】第5天之工厂模式:比萨店的秘密武器,轻松搞定对象创建!

工厂模式&#xff1a;比萨店的秘密武器&#xff0c;轻松搞定对象创建&#xff01; 大家好&#xff0c;今天我们来聊聊设计模式中的工厂模式。如果你曾经为对象的创建感到头疼&#xff0c;或者觉得代码中到处都是 new 关键字&#xff0c;那么工厂模式就是你的救星&#xff01;本…...

Redis如何解决热Key问题

目录 **如何解决 Redis 的热 Key&#xff08;Hot Key&#xff09;问题&#xff1f;****解决方案** **1. 使用多级缓存****方案** **2. 进行 Key 预分片&#xff08;Key Sharding&#xff09;****方案** **3. 使用 Redis 复制机制&#xff08;主从复制或集群&#xff09;****方案…...

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用

嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下&#xff0c;传统的视频观看方式依赖于微软的OCX控件&#xff0c;然而OCX控件的使用正面临越来越多的挑战&#xff1a; 首先&#xff0c;用户需要安装浏览器插件、调整浏览器安全级别&#xff0c;并允许ActiveX控件弹出…...

Zookeeper(58)如何在Zookeeper中实现分布式锁?

在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务&#xff0c;使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例&#xff0c;展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...

Mac端homebrew安装配置

拷打了一下午o3-mini-high&#xff0c;不如这位博主的超强帖子&#xff0c;10分钟结束战斗 跟随该文章即可&#xff0c;2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次&#xff0c;点赞258次&#xff0c;收藏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拉取代码的时候&#xff0c;git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...

python-leetcode 33.排序链表

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

【数据结构初阶第十二节】设计循环队列

云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 还有最后一道关于队列的习题&#xff0c;这题有点难&#xff0c;准备好迎接挑战吧&#xff01; 目录 1.【题目】 2.实现循环队列推荐用数组&#xff0c;Why? 3.Q1&#xff1a;如…...

基于微信小程序的民宿短租系统设计与实现(ssm论文源码调试讲解)

第4章 系统设计 4.1系统设计的目标 系统设计的目标是满足用户的需求和满足系统实现所需要的所有要求。本系统收集了信息浏览、信息删除、信息添加、信息修改、信息查询为一体[17]。改变了用户民宿短租的方式&#xff0c;提高管理员管理效率以及用户预订的效率。为用户、房主提…...

使用 Jetty 构建 HTTPS 服务入门指南

在互联网安全越来越重要的今天,使用 HTTPS 为 Web 服务提供安全传输成为标准配置。Jetty 是一个高性能、易用且功能丰富的开源 Java HTTP 服务器和 Servlet 容器,能够轻松实现 HTTPS 支持。本文将结合代码实例,引导您快速搭建一个基于 Jetty 的 HTTPS 服务。 一、Jetty 简介…...

数据结构《图》

数据结构《图论》 图的性质 一、无向图&#xff08;Undirected Graph&#xff09; 定义 由一组顶点&#xff08;Vertex&#xff09;和一组无向边&#xff08;Edge&#xff09;构成。 每条无向边用一条无方向的线段连接两个顶点&#xff0c;记为 ( (u, v) )&#xff0c;其中…...

用Chrome Recorder轻松完成自动化测试脚本录制

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

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...