C++ 中的 `string` 类型:全面解析与高效操作
C++ 中的 string 类型:全面解析与高效操作
在 C++ 中,string 类型是对字符数组的高级封装,它提供了大量内置函数,使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同,string 类型不仅自动管理内存,还提供了更丰富的操作方法。本文将通过详细讲解 string 类型的概念、常见操作及相关函数,帮助你快速掌握这一强大工具。
1. string 类型的概念
在 C++ 中,string 类型属于标准库中的 std 命名空间。它实际上是一个类,封装了字符串操作的多个方法,使得我们无需手动管理字符数组的内存,避免了 C 语言中的常见问题(如字符串长度限制、手动添加结束符\0)。通过 string 类型,我们可以更方便、更安全地操作文本数据。
创建 string 对象
#include <iostream>
#include <string>
using namespace std;int main() {string s1; // 创建空字符串string s2 = "abc"; // 创建并初始化字符串cout << "s1: " << s1 << endl; // 输出空字符串cout << "s2: " << s2 << endl; // 输出 abcreturn 0;
}
string s1;创建一个空字符串。string s2 = "abc";通过字面量初始化字符串。
2. 常见的 string 操作
2.1 字符串的输入与输出
使用 cin 输入字符串
string s;
cin >> s; // 读取不带空格的字符串
cout << s << endl; // 输出输入的字符串
cin读取时遇到空格会停止。
使用 getline 输入带空格的字符串
getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本,并将其存储为字符串。与 cin 不同,getline 可以读取包括空格在内的整行字符串。
1. getline 的第一种形式
格式:
istream& getline(istream& is, string& str);
- 这种形式的
getline以换行符(\n)作为字符串的结束标志。- 它从输入流中读取文本,直到遇到换行符为止,然后将读取到的文本(不包括换行符)存储到指定的
string类型变量str中。
示例代码:
#include<iostream>
#include<string>
using namespace std;int main() {string name;getline(cin, name); // 从键盘读取一行文本cout << name << endl; // 输出读取的字符串return 0;
}
运行时,输入的字符串(包括空格)将被读取并存储在 name 变量中,然后输出。
2. getline 的第二种形式
格式:
istream& getline(istream& is, string& str, char delim);
- 这种形式允许用户自定义结束标志(
delim),即指定一个字符作为字符串的结束标志。- 它会从输入流中读取文本,直到遇到指定的字符为止,然后将读取到的文本(不包括该字符)存储到指定的
string类型变量str中。
示例代码:
#include<iostream>
#include<string>
using namespace std;int main() {string name;getline(cin, name, 'q'); // 从键盘读取一行文本,直到遇到字符 'q'cout << name << endl; // 输出读取的字符串return 0;
}
在这个例子中,输入的文本会读取直到遇到字符 q 为止。q 字符不会被包含在最终的字符串中。
小提示:
在使用 C++ 中的
string字符串时,如果字符串中需要包含空格,getline函数是必须的。它在字符串输入时非常常见,尤其是在竞赛中处理字符串输入时,通常会使用string类型的字符串。
2.2 获取字符串长度
使用 size() 获取字符串的长度。
string s = "hello";
cout << "Length of string: " << s.size() << endl; // 输出 5
size()返回字符串的字符数。
2.3 迭代器操作
C++ 中的 string 提供了迭代器,可以用于遍历字符串中的元素。(不过访问迭代器指向的值,需要解引⽤(*)。); it != s.end(); ++it) {cout << *it << " "; // 输出字符
}

逆序遍历
string s = "abcdef";
for (auto it = s.end() - 1; it >= s.begin(); --it) {cout << *it << " "; // 输出字符
}

✅ ⼩提⽰:
• 迭代器是可以进⾏⼤⼩⽐较,也可以进⾏+或者-整数运算的。
⽐如:it++,就是让迭代器前进⼀步,it--就是让迭代器退后⼀步。
• 同⼀个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个
数。
2.4 添加字符:push_back()
push_back() 用于在字符串末尾添加一个字符。
string s = "hello";
cout << s << endl; // 输出 hellow

2.5 字符串拼接:+= 和 + 运算符
C++ 中的 string 支持 += 和 + 运算符,用于字符串拼接。
string s1 = "hello";
s1 += " world"; // 拼接字符串
cout << s1 << endl; // 输出 hello worldstring s2 = "hello";
cout << s2 + " world" << endl; // 输出 hello world

2.6 删除字符:pop_back()
pop_back() 用于删除字符串末尾的一个字符。
string s = "hello";
s.pop_back(); // 删除 'o'
cout << s << endl; // 输出 hell

- 注意:当字符串为空时,再调用
pop_back()会导致程序崩溃。
2.7 插入字符:insert()
insert() 方法允许你在字符串的指定位置插入字符或子串。
插入字符串
string s = "abcdefghi";
s.insert(3, "xxx"); // 在位置3插入字符串 "xxx"
cout << s << endl; // 输出 abcdxxxefghi

插入多个相同字符
s.insert(3, 3, 'x'); // 在位置3插入3个字符 'x'
cout << s << endl; // 输出 abcdxxxefghi
2.8 查找字符串:find()
find() 方法用于查找字符串中的子串或字符,并返回第一次出现的位置。若未找到,则返回 string::npos。
查找子串
string s = "hello world hello everyone";
size_t pos = s.find("llo");
cout << "Found 'llo' at position: " << pos << endl; //输出2

查找字符
string s = "hello world";
size_t pos = s.find('o');
cout << "Found 'o' at position: " << pos << endl; // 输出 4
查找失败
string s = "hello world";
size_t pos = s.find("xyz");
if (pos != string::npos) {cout << "Found at position: " << pos;
} else {cout << "Not found" << endl;
}
2.9 截取子串:substr()
substr() 用于从字符串中截取子串,支持指定位置和长度。
截取指定位置后的子串
string s = "hello world";
string sub = s.substr(7);
cout << sub << endl; // 输出 world

截取指定位置和长度的子串
string s = "hello world";
string sub = s.substr(7, 6);
cout << sub << endl; // 输出 orld h

2.10 字符串关系运算符
C++ 提供了一些常用的字符串比较运算符,如 ==、!=、<、> 等,比较是基于字典顺序进行的。
字符串相等比较
string s1 = "hello";
string s2 = "hello";
if (s1 == s2) {cout << "Equal" << endl; // 输出 Equal
}
字符串大小比较
string s1 = "apple";
string s2 = "banana";
if (s1 < s2) {cout << "apple is less than banana" << endl;
}
2.11 字符串转数字:stoi()、stol()、stod()
这些函数将字符串转换为整数、长整型或浮点型。
string s = "123";
int num = stoi(s);
cout << num << endl; // 输出 123string s2 = "3.14";
double pi = stod(s2);
cout << pi << endl; // 输出 3.14
2.12 将数字转换为字符串:to_string()
to_string() 将数字转换为字符串。
int num = 123;
string str = to_string(num);
cout << str << endl; // 输出 123
3. 总结
C++ 的 string 类型为处理字符串提供了强大而高效的工具。通过使用诸如 insert()、find()、substr() 等函数,我们可以轻松地在字符串中进行插入、查找、截取等操作,避免了传统字符数组的复杂性。此外,运算符重载和转换函数使得字符串与其他数据类型之间的转换变得简便。掌握这些技巧,你将能够在实际开发中更高效地处理字符串相关问题。
相关文章:
C++ 中的 `string` 类型:全面解析与高效操作
C 中的 string 类型:全面解析与高效操作 在 C 中,string 类型是对字符数组的高级封装,它提供了大量内置函数,使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同,string 类型不仅自动管理内存,…...
go语言中的Stringer的使用
Go 语言中的 Stringer 是一个非常有用的接口,它在标准库的 fmt 包中定义。Stringer 接口允许类型定义它们的字符串表示方式,这在格式化输出时特别有用。让我们深入了解一下: Stringer 接口定义: type Stringer interface {Strin…...
Java入门进阶
文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化(从Date到…...
【大数据技术】搭建完全分布式高可用大数据集群(Scala+Spark)
搭建完全分布式高可用大数据集群(Scala+Spark) scala-2.13.16.tgzspark-3.5.4-bin-without-hadoop.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Spark的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/softwa…...
使用vLLM部署Qwen2.5-VL-7B-Instruct模型的详细指南
使用vLLM部署Qwen2.5-VL-7B-Instruct模型的详细指南 引言环境搭建安装vLLM安装依赖库下载模型启动vLLM服务器总结参考 引言 近年来,随着大规模语言模型(LLM)的快速发展,如何高效地进行模型推理成为了一个热门话题。vLLM作为一个专…...
AWS门店人流量数据分析项目的设计与实现
这是一个AWS的数据分析项目,关于快消公司门店手机各个门店进店人流量和各个产品柜台前逗留时间(利用IoT设备采集)和销售数据之间的统计分析,必须用到但不限于Amazon Kensis Data Stream,Spark Streaming,Sp…...
C#结合html2canvas生成切割图片并导出到PDF
目录 需求 开发运行环境 实现 生成HTML范例片断 HTML元素转BASE64 BASE64转图片 切割长图片 生成PDF文件 小结 需求 html2canvas 是一个 JavaScript 库,它可以把任意一个网页中的元素(包括整个网页)绘制到指定的 canvas 中…...
485网关数据收发测试
目录 1.UDP SERVER数据收发测试 使用产品: || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A(TX)连接RX B(RX)连接TX 打开1个网络调试助手,模拟用户的UDP客户端设…...
InnoDB和MyISAM的比较、水平切分和垂直切分、主从复制中涉及的三个线程、主从同步的延迟产生和解决
InnoDB和MyISAM的比较 事务支持: InnoDB支持:支持事务 (ACID 属性)。支持 Commit、Rollback 和 Savepoint 操作。适合需要事务处理的应用,例如银行系统。MyISAM:不支持事务。每次操作都是自动提交,不能回滚或中止。适合对事务要求…...
JDK9新特性
文章目录 新特性:1.模块化系统使用模块化module-info.java:exports:opens:requires:provides:uses: 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量:/var…...
基于Ubuntu2404搭建Zabbix7.2
Zabbix 搭建zabbix zabbix7.2已推出:官网 增加的新功能如下: 1.使用新的热门商品小部件全面概览指标 数据概览小部件已转换为热门项目小部件使用项目模式可以实现细粒度的项目选择利用条形图、指标和迷你图来可视化您的数据定义价值阈值以动态地可视化…...
Math Reference Notes: 符号函数
1. 符号函数的定义 符号函数(Sign Function) sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值(即正数、负数或零)的函数。 它的定义如下: sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…...
【数据结构】链表应用-链表重新排序
重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题? 我选用了迭代法来反转链表。这是一种经典且高…...
学习threejs,pvr格式图片文件贴图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…...
数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)
10.6. 数据库开发常识 作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋…...
2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题2)-网络部分解析-附详细代码
目录 附录1:拓扑图编辑 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.EG1 14.EG2 15.AP2 16.AP3 附录1:拓扑图 附录2:地址规划表...
100.7 AI量化面试题:如何利用新闻文本数据构建交易信号?
目录 0. 承前1. 解题思路1.1 数据处理维度1.2 分析模型维度1.3 信号构建维度 2. 新闻数据获取与预处理2.1 数据获取接口2.2 文本预处理 3. 情感分析与事件抽取3.1 情感分析模型3.2 事件抽取 4. 信号生成与优化4.1 信号构建4.2 信号优化 5. 策略实现与回测5.1 策略实现 6. 回答话…...
【前端】【Ts】【知识点总结】TypeScript知识总结
一、总体概述 TypeScript 是 JavaScript 的超集,主要通过静态类型检查和丰富的类型系统来提高代码的健壮性和可维护性。它涵盖了从基础数据类型到高级类型、从函数与对象的类型定义到类、接口、泛型、模块化及装饰器等众多知识点。掌握这些内容有助于编写更清晰、结…...
【前端】【Ts】TypeScript的关键知识点
一、知识点总结 (一)void 与 never 的区别 (1) void:声明函数无返回值,但可以走到 return 行。(2) never:表示函数不会走到 return 行,常用于抛异常或无限循环。 (二)字面量类型与联…...
C++,STL,【目录篇】
文章目录 一、简介二、内容提纲第一部分:STL 概述第二部分:STL 容器第三部分:STL 迭代器第四部分:STL 算法第五部分:STL 函数对象第六部分:STL 高级主题第七部分:STL 实战应用 三、写作风格四、…...
2502vim,vim文本对象中文文档
介绍 文本块用户(textobj-user)是一个可帮助你毫不费力地创建自己的文本对象的Vim插件. 因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法. 你可用正则式来定义简单的文本对象,或使用函数来定义复杂的文本对象.如… 文本对…...
【AI论文】直接对齐算法之间的差异模糊不清
摘要:直接对齐算法(DAAs)通过在对齐人类反馈的强化学习(RLHF)中用直接策略优化替代强化学习(RL)和奖励建模(RM),简化了语言模型对齐过程。DAAs可以根据其排序…...
(9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,
(11) 查看断点 info b: # info b举例: (12)删除断点 delete 2 或者删除所有断点: # 1. 删除指定的断点 delete 3 # 2. 删除所有断点 delete 回车,之后输入 y 确认删除所有断点 举…...
中间件的概念及基本使用
什么是中间件 中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲:Tomcat、WebLogic、Redis、IIS;狭义上来讲,ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…...
什么是ce认证
CE认证,即只限于产品不危及人类、动物和货品的安全方面的基本安全要求,而不是一般质量要求,协调指令只规定主要要求,一般指令要求是标准的任务。因此准确的含义是:CE标志是安全合格标志而非质量合格标志。是构成欧洲指令核心的&qu…...
S4 HANA手工记账Tax Payable – FB41
本文主要介绍在S4 HANA OP中手工记账Tax Payable – FB41。具体请参照如下内容: 手工记账Tax Payable – FB41 该事务代码用于手工处理税码统驭科目的记账,一般税码科目需要设置为只能自动记账,因此无法手工对税码统驭科目记账,但…...
Java 大视界 -- Java 大数据在智慧文旅中的应用与体验优化(74)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
[leetcode]两数之和等于target
源代码 #include <iostream> #include <list> #include <iterator> // for std::prev using namespace std; int main() { int target 9; list<int> l{ 2, 3, 4, 6, 8 }; l.sort(); // 确保列表是排序的,因为双指针法要求输入是…...
老游戏回顾:G2
一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去,古拉纳斯将希望之光给予人们,人类令希望之光不断扩大,将繁荣握在手中。 但是,暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战,…...
行为驱动开发(BDD)如何提高自动化测试效率
在软件开发的过程中,自动化测试一直扮演着至关重要的角色。随着需求变化日益复杂、开发周期不断压缩,如何提升自动化测试的效率和准确性成为了现代软件开发团队的核心挑战之一。行为驱动开发(BDD,Behavior Driven Development&…...
