【C++ 】string类操作全解析

1. 为什么学习 string 类?

1.1 C 语言中的字符串

C 语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C 标准库中提供了一些 str 系列的库函数,

但是这些库函数与字符串是分离开的,不太符合 OOP (面向对象程序设计)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问

2.标准库中的 string 类

2.1 string 类的常用接口说明(注意下面只讲解最常用的接口)

(constructor)函数名称

功能说明

string() (重点)

构造空的 string 类对象,即空字符串

string(const char* s) (重点)

用 C-string 来构造 string 类对象

string(size_t n, char c)

string 类对象中包含 n 个字符 c

string(const string&s) (重点)

拷贝构造函数

void Teststring() 
{  string s1; // 构造空的string类对象s1  string s2("hello bit"); // 用C格式字符串构造string类对象s2  string s3(s2); // 拷贝构造s3 
}

2.2string 类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符的长度
length返回字符串有效字符的长度(与 size 功能一致)
capacity返回字符串当前分配的总空间大小(包括未使用的预留空间)
empty(重点)检测字符串是否为空串,若是则返回 true,否则返回 false
clear(重点)清空字符串中的有效字符(不改变空间总大小,仅将 size 置为 0)
reserve(重点)为字符串预留指定大小的空间,用于减少后续插入操作的内存分配次数
resize(重点)将有效字符的个数调整为 n 个:
- 若 n 小于当前 size,则截断字符串;
- 若 n 大于当前 size,则用指定字符 c(默认 '\0')填充多出的部分

示例:

#include <iostream>
#include <string>
using namespace std;int main() {// 初始化一个字符串string str = "Hello";cout << "初始字符串: " << str << endl;// 1. size() 和 length():返回有效字符长度(功能一致)cout << "\n1. size() = " << str.size() << endl;cout << "   length() = " << str.length() << endl;// 2. capacity():返回当前总空间大小(包括预留空间)cout << "\n2. 初始 capacity = " << str.capacity() << endl;// 3. reserve(n):预留空间(不改变有效字符数)str.reserve(20);  // 预留至少20个字符的空间cout << "   调用 reserve(20) 后,capacity = " << str.capacity() << endl;cout << "   此时 size = " << str.size() << "(reserve不改变有效字符数)" << endl;// 4. resize(n):调整有效字符数(截断或填充)cout << "\n3. 原字符串: " << str << endl;str.resize(8, '!');  // 扩展到8个字符,新增部分用'!'填充cout << "   调用 resize(8, '!') 后: " << str << endl;cout << "   此时 size = " << str.size() << ", capacity = " << str.capacity() << endl;str.resize(3);  // 截断到3个字符cout << "   调用 resize(3) 后: " << str << endl;cout << "   此时 size = " << str.size() << ", capacity = " << str.capacity() << endl;// 5. empty():检测是否为空串cout << "\n4. 字符串是否为空? " << (str.empty() ? "是" : "否") << endl;// 6. clear():清空有效字符(size置0,capacity不变)str.clear();cout << "   调用 clear() 后,字符串: \"" << str << "\"" << endl;cout << "   此时 size = " << str.size() << ", capacity = " << str.capacity() << endl;cout << "   清空后是否为空? " << (str.empty() ? "是" : "否") << endl;return 0;
}

注意:

1. size()与 length()方法底层实现原理完全相同,引入 size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用 size()。

2. clear()只是将 string 中有效字符清空,不改变底层空间大小。

3.resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到 n 个,不同的是当字符个数增多时:resize(n)用 0 来填充多出的元素空间,resize(size_t n, char c)用字符 c 来填充多出的元素空间。注意:resize 在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

4.reserve(size_t res_arg=0):为 string 预留空间,不改变有效元素个数,当 reserve 的参数小于 string 的底层空间总大小时,reserver 不会改变容量大小。

2.3 string 类对象的访问及遍历操作

函数 / 特性名称功能说明
operator[](重点)返回字符串中 pos 位置的字符。其中,const string 类对象调用时返回不可修改的字符(const char&),非 const 对象调用时返回可修改的字符(char&)。
begin() + end()begin() 获取指向字符串第一个字符的迭代器;end() 获取指向字符串最后一个字符下一个位置的迭代器(作为遍历结束标志)。两者配合可遍历整个字符串。
rbegin() + rend()rbegin() 获取指向字符串最后一个字符的反向迭代器(用于逆向遍历的起始);rend() 获取指向字符串第一个字符前一个位置的反向迭代器(作为逆向遍历结束标志)。两者配合可逆向遍历整个字符串。
范围 for 循环C++11 新增的简洁遍历方式,可自动遍历字符串中的每个字符(语法:for (char c : str) { ... }),本质是迭代器的语法糖,遍历过程中会自动处理迭代器的移动和边界判断。

这份代码展示了 C++ string的多种元素访问和遍历方式:

  1. operator[]访问:

    1. 最常用的访问方式,通过索引直接访问字符

    2. 支持读写操作,但不进行边界检查,访问越界会导致未定义行为

  2. at()方法访问:

    1. operator[]类似,但会进行边界检查

    2. 访问越界时会抛出out_of_range异常,更安全

  3. 迭代器遍历:

    1. begin()end()提供正向迭代器,用于从前往后遍历

    2. rbegin()rend()提供反向迭代器,用于从后往前遍历

  4. const 迭代器:

    1. 用于const string对象的遍历

    2. 保证不会修改字符串内容

  5. 范围 for 循环:

    1. C++11 引入的简洁遍历方式

    2. 通过引用 (char&) 可以修改元素,否则只能读取

#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {string str = "Hello, String!";cout << "原始字符串: " << str << endl;cout << "字符串长度: " << str.size() << endl << endl;// 1. 使用operator[]访问单个元素cout << "1. 使用operator[]访问:" << endl;if (!str.empty()) {cout << "第一个字符: " << str[0] << endl;cout << "最后一个字符: " << str[str.size() - 1] << endl;// 修改元素str[0] = 'h';cout << "修改后第一个字符: " << str[0] << endl;}cout << endl;// 2. 使用at()方法访问单个元素(带边界检查)cout << "2. 使用at()访问:" << endl;try {cout << "索引为7的字符: " << str.at(7) << endl;// 尝试访问超出范围的索引,会抛出out_of_range异常// cout << str.at(100) << endl;} catch (const out_of_range& e) {cout << "访问异常: " << e.what() << endl;}cout << endl;// 3. 使用迭代器遍历cout << "3. 使用迭代器遍历:" << endl;cout << "正向遍历: ";for (string::iterator it = str.begin(); it != str.end(); ++it) {cout << *it;}cout << endl;// 4. 使用反向迭代器遍历cout << "4. 使用反向迭代器遍历:" << endl;cout << "反向遍历: ";for (string::reverse_iterator rit = str.rbegin(); rit != str.rend(); ++rit) {cout << *rit;}cout << endl << endl;// 5. 使用const迭代器遍历(用于const string)cout << "5. 使用const迭代器遍历:" << endl;const string const_str = "Const String";cout << "const字符串正向遍历: ";for (string::const_iterator cit = const_str.begin(); cit != const_str.end(); ++cit) {cout << *cit;}cout << endl;cout << "const字符串反向遍历: ";for (string::const_reverse_iterator crit = const_str.rbegin(); crit != const_str.rend(); ++crit) {cout << *crit;}cout << endl << endl;// 6. 使用范围for循环遍历(C++11及以上)cout << "6. 使用范围for循环遍历:" << endl;cout << "范围for遍历: ";for (auto c : str) {cout << c;}cout << endl;// 范围for修改元素for (char& c : str) {  // 注意使用引用才能修改if (c == ',') {c = ';';}}cout << "修改后的字符串: " << str << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920640.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAY15-新世纪DL(DeepLearning/深度学习)战士:破(超参数调试、Batch正则化和程序框架)3

本文参考文章0.0 目录-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授-CSDN博客 1.调试处理 神经网络的改变会涉及到许多不同的超参数设置&#xff0c;现在&#xff0c;对于超参数而言&#xff0c;如何找到一套比较好的设定&#xff1f; 训练深度最难的事之一是你…

Android 14 PMS源码分析

源码参考&#xff1a;Search (aospxref.com) 一、简介 PackageManagerService&#xff08;简称 PMS&#xff09;&#xff0c;是 Android 系统核心服务之一&#xff0c;处理包管理相关的工作&#xff0c;常见的比如安装、卸载应用等。本章针对SyetemServer、PMS构造方法重点模…

内省排序:相对最迅速的通用排序算法

&#x1f50d; 内省排序&#xff1a;相对最迅速的通用排序算法 &#x1f680; 前言&#xff1a;排序算法的演进之路 排序算法是计算机科学的核心基础之一&#xff0c;其性能直接影响着数据库系统、科学计算、图形渲染等领域的效率。随着硬件架构的发展&#xff0c;排序算法经历…

Linux驱动开发重要操作汇总

本文主要记录imx6ull的linux驱动开发过程中常用的一些操作。 uboot编译 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean make ARCHarm CROSS_COMPILEarm-linux-gnueabihf mx6ull_14x14_evk_emmc_defconfig make V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- …

【Java后端】MySQL 常见 SQL 语句优化指南

在 MySQL 中&#xff0c;SQL 优化是性能调优的核心环节&#xff0c;尤其是在数据量大、并发高的情况下。这里整理一份 MySQL 常见 SQL 语句优化指南&#xff0c;从查询写法、索引使用到执行计划分析&#xff0c;涵盖实用技巧&#xff1a;1. 查询语句层面的优化 ✅ 避免 SELECT …

Golang 面试题「高级」

以下是 100 道 Golang 高级面试题及答案&#xff0c;聚焦语言底层实现、并发深度优化、性能调优、源码级理解等核心方向&#xff0c;适合资深开发者或架构师级别的面试场景&#xff1a; 一、GPM 调度模型与并发深度 问题&#xff1a;Goroutine 的栈空间初始大小是多少&#xff…

WebGIS视角:体感温度实证,哪座“火炉”火力全开?

目录 前言 一、火炉城市空间分布及特点 1、空间分布 2、气候特点 二、数据来源及技术实现 1、数据来源介绍 2、技术路线简介 三、WebGIS系统实现 1、后端设计与实现 2、前端程序实现 四、成果展示 1、整体展示 2、蒸烤模式城市 3、舒适城市 五、总结 前言 “火炉…

《数据结构入门:顺序表的结构设计与核心操作(C 语言版)》

目录 一. 线性表 二. 顺序表的概念与结构 2.1 核心概念 2.2 两种常见结构 静态顺序表 动态顺序表 2.3 核心区别对比 四. 顺序表的实现 4.1 顺序表的定义 4.2 顺序表初始化 4.3 动态顺序表容量检查与扩容 4.4 动态顺序表插入数据 4.4.1 头插 4.4.2 尾插 4.4.3 指…

[Maven 基础课程]Maven 是什么

Maven 的官方网站&#xff1a;https://maven.apache.org/ 来自 Maven 官网的对于 Maven 是什么的描述&#xff1a; Apache Maven is a build tool for Java projects. Using a project object model (POM), Maven manages a project’s compilation, testing, and documentat…

【MATLAB例程】三维组合导航,滤波使用EKF,带严格的惯导推算、雅克比求解函数,图像对比滤波前后的速度、位置、姿态

文章目录程序介绍系统建模滤波框架仿真设置性能对比代码优点运行结果MATLAB源代码程序介绍 本程序实现了 三维状态量的扩展卡尔曼滤波&#xff08;EKF&#xff09;组合导航仿真&#xff0c;采用严格的15维误差状态模型&#xff0c;状态向量包括&#xff1a; x[pxpypzvxvyvzϕθ…

港资企业在大陆,如何靠 SD-WAN 专线畅连香港?

在当前市场形势下&#xff0c;港资企业在大陆的业务布局不断拓展&#xff0c;企业间访问香港总部系统以及香港员工到内陆出差时访问相关系统&#xff0c;成为日常运营的高频需求。然而&#xff0c;网络问题却常常阻碍业务的顺畅开展&#xff0c;基于 SD-WAN 专线的到香港加速网…

并发编程——08 Semaphore源码分析

1 概述Semaphore 是基于 AQS CAS 实现的&#xff0c;可根据构造参数的布尔值&#xff0c;选择使用公平锁&#xff0c;还是非公平锁。Semaphore 默认使用非公平锁&#xff1b;2 构造函数 // AQS的实现 private final Sync sync;// 默认使用非公平锁 public Semaphore(int permi…

Java全栈开发面试实战:从基础到微服务的深度解析

Java全栈开发面试实战&#xff1a;从基础到微服务的深度解析 一、面试开场 面试官&#xff08;中年工程师&#xff0c;穿着休闲但专业&#xff09;&#xff1a;你好&#xff0c;我是李工&#xff0c;今天来聊一下你的技术背景。你之前在XX科技做全栈开发&#xff0c;对吧&#…

CVPR深度学习论文创新合集拆解:模型训练速度算提升

关注gongzhonghao【CVPR顶会精选】大语言模型扩散Transformer的深度融合&#xff0c;让文本到图像生成更精准、细节更丰富&#xff1b;同时&#xff0c;专家轨迹正则化深度强化学习在自动对焦中的稳定加速表现&#xff0c;也展示了深度学习与轨迹建模结合的潜力。这样的组合正在…

【智能体】零代码学习 Coze 智能体(2)创建智能体的完整步骤

欢迎关注【AGI使用教程】 专栏 【智能体】零代码学习 Coze 智能体&#xff08;1&#xff09; 【智能体】零代码学习 Coze 智能体&#xff08;2&#xff09; 【智能体】零代码学习 Coze 智能体&#xff08;1&#xff09;1、登录 Coze 平台2、创建智能体3、智能体编排页面4、编写…

WPF和WinFrom区别

WPF 总结Windows Presentation Foundation (WPF) 是微软开发的一个用于构建 Windows 桌面应用程序的用户界面框架。它基于 .NET Framework&#xff0c;提供丰富的图形、动画和数据绑定功能&#xff0c;帮助开发者创建现代化、高性能的应用程序。以下是其核心要点总结&#xff1…

数据库原理及应用_数据库基础_第3章数据库编程_常用系统函数

前言 "<数据库原理及应用>(MySQL版)".以下称为"本书"中3.1.2节内容 引入 数据库常用系统函数的分析.上一篇帖子分析了,数据库函数需要看看能否被C语言函数替代 1.字符串函数 1)计算字符串字符数的函数和字符串长度的函数 语法: CHAR_LENGTH(str)…

回归问题的损失函数

简单来说&#xff0c;​在回归问题中&#xff0c;最常用的损失函数是均方误差&#xff08;MSE, Mean Squared Error&#xff09;和平均绝对误差&#xff08;MAE, Mean Absolute Error&#xff09;​。它们衡量的都是模型预测值&#xff08;ŷ&#xff09;与真实值&#xff08;y…

吴恩达机器学习(四)

一、神经网络神经元模拟逻辑单元&#xff1a;神经网络简单模型&#xff1a;神经网络中的前向传播过程&#xff1a;依次计算激活项&#xff0c;从输入层到隐藏层再到输出层的过程。样例&#xff1a;多元分类&#xff1a;

【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解

【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解一、字符集修改方法1. **配置文件修改**2. **SQL命令修改**3. **数据迁移方案**二、底层原理与注意事项1. **字符集与排序规则**2. **存储与性能影响**3. **数据一致性风险**三、常见问题解决1. **乱码问题**2. **性能…