【C++标准库类型】深入理解string类型:从基础到实践

目录

一、string类型的基本概念

1.1. 定义与头文件

1.2. 本质与特点

1.3. 与 C 风格字符串的区别

二、string类型的构造函数

2.1. 默认构造函数

2.2. 使用C风格字符串初始化

2.3. 拷贝构造函数

2.4. 使用字符和重复次数初始化

2.5. 使用子串初始化

三、string类型的赋值操作

3.1 使用赋值运算符=

3.2 使用assign成员函数

四、string类型的容量操作

五、string类型的元素访问

5.1 使用下标运算符[]

5.2 使用at成员函数

六、string类型的迭代遍历

七、string类型的字符串操作

八、字符串输入输出处理

九、内存管理与性能优化

9.1 容量管理

9.2 避免不必要的拷贝

十、字符串与数值的转换

十一、C++11 及后续版本的新特性

十二、string 类型在实际应用中的示例

十三、 参考资料


在C++编程中,string类型是一个非常重要的标准库类型,用于处理可变长度的字符序列。相比C语言中的字符数组(以\0结尾的字符串),std::string提供了更高效、更安全的字符串操作方法。

一、string类型的基本概念

1.1. 定义与头文件

std::string是C++标准库中的一个类,定义在<string>头文件中。要使用std::string,需要在程序开头包含该头文件:

include <string>

为了简化代码,通常使用std命名空间:

using namespace std;

1.2. 本质与特点

  • std::string本质std::string本质上是一个模板类 basic_string 的 typedef,即 typedef basic_string<char> string;内部封装了char*指针,通过容器的方式管理字符串。
  • 动态增长和缩小:支持动态增长和缩小,无需关心字符串的长度或容量。

1.3. 与 C 风格字符串的区别

  • 自动内存管理string 自动处理内存分配和释放,无需手动管理。

  • 安全性:避免缓冲区溢出(如 strcpy 的潜在风险)。

  • 功能丰富:支持拼接、查找、替换等操作,无需调用低级函数。

二、string类型的构造函数

std::string提供了多种构造函数,用于初始化字符串对象。以下是一些常用的构造函数。

2.1. 默认构造函数

创建一个空的字符串对象:

string str1;  // str1是一个空字符串

2.2. 使用C风格字符串初始化

使用C风格字符串(以\0结尾的字符数组)初始化std::string对象。

const char* cstr = "hello";
string str2(cstr);  // str2是"hello"的副本

2.3. 拷贝构造函数

使用另一个std::string对象初始化新的字符串对象。

string str3(str2);  // str3是str2的副本

2.4. 使用字符和重复次数初始化

使用指定的字符和重复次数初始化字符串。

string str4(5, 'x');  // str4是"xxxxx"

2.5. 使用子串初始化

从已有的字符串中提取子串,用于初始化新的字符串对象。

string str5(str4, 1, 3);  // str5是str4从索引1开始的3个字符,即"xxx"

三、string类型的赋值操作

std::string支持多种赋值方式,可以将一个字符串的值赋给另一个字符串对象。

3.1 使用赋值运算符=

可以将C风格字符串、std::string对象或单个字符赋值给std::string对象:

string str1;
str1 = "hello";  // 将C风格字符串赋值给str1
string str2 = str1;  // 将str1赋值给str2
string str3;
str3 = 'a';  // 将字符'a'赋值给str3,注意这里str3会变成"a"

3.2 使用assign成员函数

assign成员函数提供了更多的赋值方式,可以指定赋值的起始位置和长度:

使用assign成员函数
assign成员函数提供了更多的赋值方式,可以指定赋值的起始位置和长度:

四、string类型的容量操作

std::string提供了多个成员函数,用于获取或修改字符串的容量。

①获取字符串的长度:使用sizelength成员函数获取字符串中字符的个数(不包括结束符\0

string str = "hello";
size_t len = str.size();  // len是5

②判断字符串是否为空:使用empty成员函数判断字符串是否为空。

if (str.empty()) {cout << "字符串为空" << endl;
} else {cout << "字符串不为空" << endl;
}

③修改字符串的容量

  • 使用reserve成员函数为字符串预留空间,不改变当前内容:

str.reserve(100);  // 为str预留至少100个字符的空间
  • 使用resize成员函数改变字符串的大小,可以指定填充字符:
str.resize(10, '*');  // 将str的大小改为10,不足部分用'*'填充
  • 使用clear成员函数清空字符串的内容,但不改变容量:
str.clear();  // str变为空字符串,但容量不变

五、string类型的元素访问

可以通过多种方式访问std::string中的字符。

5.1 使用下标运算符[]

通过下标运算符访问字符串中的单个字符,下标从0开始:

string str = "hello";
char ch = str[1];  // ch是'e'

注意:使用下标运算符访问字符时,不会进行越界检查,需要确保下标在有效范围内。

5.2 使用at成员函数

at成员函数提供了安全的字符访问方式,会进行越界检查:

char ch = str.at(1);  // ch是'e',如果索引超出范围,会抛出std::out_of_range异常

六、string类型的迭代遍历

可以使用迭代器或范围for循环遍历std::string中的字符。

①使用迭代器:std::string提供了beginend成员函数,返回指向字符串开头和结尾的迭代器

string str = "hello";
for (string::iterator it = str.begin(); it != str.end(); ++it) {cout << *it << " ";
}
// 输出:h e l l o

②使用范围for循环:范围for循环提供了一种更简洁的遍历方式

for (char ch : str) {cout << ch << " ";
}
// 输出:h e l l o

七、string类型的字符串操作

std::string提供了丰富的成员函数,用于执行各种字符串操作。

①字符串连接:使用+运算符或append成员函数连接字符串

string str1 = "hello";
string str2 = "world";
string result = str1 + " " + str2;  // 使用+运算符连接
cout << result << endl;  // 输出:hello worldstring str3 = "hello";
str3.append(" ");
str3.append(str2);  // 使用append成员函数连接
cout << str3 << endl;  // 输出:hello world

②字符串比较:可以使用关系运算符(==!=<<=>>=)或compare成员函数比较字符串

if (str1 == str2) {cout << "str1等于str2" << endl;
} else {cout << "str1不等于str2" << endl;
}int cmp = str1.compare(str2);
if (cmp == 0) {cout << "str1等于str2" << endl;
} else if (cmp < 0) {cout << "str1小于str2" << endl;
} else {cout << "str1大于str2" << endl;
}

③查找子串:使用findrfind成员函数查找子串的位置

size_t pos = str.find("world");
if (pos != string::npos) {cout << "找到子串,位置为:" << pos << endl;
} else {cout << "未找到子串" << endl;
}size_t rpos = str.rfind("o");
cout << "最后一个'o'的位置为:" << rpos << endl;

④替换子串:使用replace成员函数替换字符串中的子串

string str =

八、字符串输入输出处理

①读取整行输入:使用 getline() 代替 cin >> 以避免空格截断

string line;
getline(cin, line);  // 读取一行输入(包括空格)

②格式化处理:结合 stringstream 进行字符串分割或转换

string data = "10 3.14 hello";
stringstream ss(data);
int num; double d; string s;
ss >> num >> d >> s;  // 解析为 num=10, d=3.14, s="hello"

九、内存管理与性能优化

9.1 容量管理

  • capacity():返回当前分配的存储容量。

  • reserve(n):预分配至少 n 个字符的内存,减少动态分配次数。

  • shrink_to_fit():请求减少容量以匹配实际大小(C++11)。

9.2 避免不必要的拷贝

  • 使用移动语义(C++11)提升性能:

string s1 = "Hello";
string s2 = std::move(s1);  // s1 变为空,s2 接管资源
  • 传递 const string& 避免拷贝。

十、字符串与数值的转换

字符串 → 数值

string s = "123";
int num = stoi(s);         // 转换为 int
double d = stod("3.14");  // 转换为 double

数值 → 字符串

string s1 = to_string(42);      // "42"
string s2 = to_string(3.1415); // "3.1415"

十一、C++11 及后续版本的新特性

字面量后缀

using namespace std::string_literals;
auto s = "Hello"s;  // 直接生成 string 类型(而非 const char*)

范围 for 循环

for (char c : s) {cout << c << " ";
}

十二、string 类型在实际应用中的示例

文件读取与处理:在处理文本文件时,string 类型非常有用。例如,从文件中逐行读取内容并进行处理:

#include <iostream>
#include <fstream>
#include <string>
int main() {std::ifstream file("test.txt");if (file.is_open()) {std::string line;while (std::getline(file, line)) {// 对每一行进行处理std::cout << line << std::endl;}file.close();} else {std::cerr << "Unable to open file" << std::endl;}return 0;
}

字符串查找与替换:在处理字符串时,经常需要查找特定的子字符串并进行替换。string 类型提供了 find() 成员函数来查找子字符串的位置,以及 replace() 成员函数来进行替换:

std::string str = "hello world";
size_t pos = str.find("world");
if (pos != std::string::npos) {str.replace(pos, 5, "C++");std::cout << str << std::endl;  // 输出: hello C++
}

希望这篇文章能够帮助你对 string 类型有更深入的理解和掌握。如果还有其他关于 C++ 的问题,欢迎继续探索和学习。


十三、 参考资料

  • 《C++ Primer》

  • cppreference.com

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

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

相关文章

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…

SPring 学习积累1 关于下载相关jdk maven 版本

3.15.1 注意下载的版本 有些是不适配的&#xff0c;官网有提示&#xff1b; 3.15.2 注意配置环境变量时需要注意admistartor 中的java路径和系统变量是否一致&#xff0c;一行要一致&#xff0c;不然后续安装maven之后&#xff0c;使用命令 mvn -version时会显示以下错误&…

Excel(函数篇):Vlookup函数 详细用法

目录 Vlookup函数基础用法精确查找易错问题员工信息查询表 进阶用法近似匹配&#xff08;模糊查找&#xff09;结合通配符查找反向查找 高级技巧多条件查找动态列查询 错误处理屏蔽错误值处理数字/文本格式问题注意事项常见错误解决方案 拓展用法跨表与跨工作簿查找查找返回多列…

对最近的刷题做一个小总结(关于动态规划和贪心)

文章目录 1. 小总结2. 两道算法题2.1 数组中两个字符串的最小距离2.2 孩子们的游戏 1. 小总结 最近刷了很多算法题&#xff0c;真正了解到的算法应是dfs&#xff0c;多元dfs&#xff0c;以及动态规划和贪心。 dfs和多元dfs目前并没有真正深入研究过&#xff0c;不过熟悉套路之…

jmeter分布式原理及实例

一、执行原理 二、相关注意事项 关闭防火墙所有上网控制机、代理机、服务器都在同一个网络上所有机器的jmeter和java版本必须一致关闭RMI.SSL开关 三、配置和执行 配置&#xff1a; 修改bin/jmeter.properties文件&#xff1a; 代理机&#xff1a; 修改服务端口&#xff1…

C++ STL 详解 ——vector 的深度解析与实践指南

一、vector 的核心概念与底层机制 1.1 动态数组的本质 连续内存存储&#xff1a;与普通数组相同&#xff0c;vector 使用连续的内存空间&#xff0c;支持 O (1) 时间复杂度的随机访问。动态扩容特性&#xff1a;通过push_back等操作自动调整容量&#xff0c;无需手动管理内存…

【SpringBoot】——在做一些项目中所学到的新的技术栈和一些小技巧(主要为MQ,详细请看目录和文章)

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

0经验cursor开发一款跨端app

设备&#xff1a;mac电脑cursor 1.输入诉求 我要实现一个跨端的地址应用&#xff0c;使其可以在ios、安卓、小程序和网页端都可以使用。这是一个demo的项目&#xff0c;功能不必要太过复杂&#xff0c;下面需要你和我多次沟通完成这个任务。你先根据我的内容输入&#xff0c…

Element Ui - 编辑时表单校验信息未清空问题处理

Element Ui 关闭对话框清空验证消息&#xff0c;清除form表单的操作 首先在对话框 取消按钮 添加 click事件&#xff0c;例如&#xff1a;&#xff08;ps&#xff1a;callOf 里面的addGroupData和ref - - &#xff09; <div slot"footer" class"dialog-foo…

OpenCV图像加权函数:addWeighted

1 addWeighted函数 在OpenCV 里&#xff0c;addWeighted 函数的作用是对两个图像进行加权求和&#xff0c;常用于图像融合、图像过渡等场景。函数如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 参数解释 src1&#xff1a;第一个输入图…

Science Robotics 利用机器学习进行鳐鱼的仿生设计

对于海洋生物而言&#xff0c;生物力学和流体动力学力都会对游泳速度施加物理限制&#xff0c;促使游泳策略和鳍形状的趋同进化。鉴于这些限制是与尺度相关的&#xff0c;如雷诺数&#xff08;Re&#xff09;&#xff0c;这就产生了自然运动缩放定律&#xff0c;该定律根据生物…

基于ssm的一家运动鞋店的产品推广网站的设计

项目简介 一家运动鞋店实现了以下功能&#xff1a; 实现了用户在线选择试题并完成答题&#xff0c;在线查看考核分数。管理员管理收货地址管理、购物车管理、字典管理、留言版管理、新闻信息管理、产品管理、产品收藏管理、产品评价管理、产品订单管理、单页数据管理、用户管…

什么是后训练?大语言模型训练后优化方法综述,87页pdf

大语言模型&#xff08;LLMs&#xff09;的出现彻底改变了自然语言处理领域&#xff0c;使其在从对话系统到科学探索的各个领域中变得不可或缺。然而&#xff0c;其预训练架构在特定场景中往往表现出局限性&#xff0c;包括推理能力受限、伦理不确定性以及领域特定性能欠佳等问…

python开发订单查询功能(flask+orm bee)

1. 搭建python环境。 可以参考其它文档。 此处python使用 3.12 IDE随意&#xff0c;PyCharm 或 Eclipse PyDev也可以。 2. Flask 2.1 安装Flask pip install Flask 2.2 一个最简单的flask实例 创建一个工程&#xff0c; 新建一个 main.py文件&#xff0c; 输入以下内容…

工作记录 2017-01-11

工作记录 2017-01-11 序号 工作 相关人员 1 协助BPO进行Billing的工作。 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了Patient Insurance的文件上传。 1.1 文件存储改为MedI“EHRWfs”Account“patientInfo”MRN 1.2 “Upload Files” to “Upload/Vie…

基于javaweb的SpringBoot个人健康管理系统小程序微信小程序设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

b站视频下载工具软件怎么下载

自行配置FFMPEG环境 请优先选择批量下载&#xff0c;会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示&#xff0c;视频音频文件无法合并生成mp4文件 更新批量下载标题&#xff0c;只取视频原标题&#xff0c;B站反爬机制登陆后下载多了…

简单的模拟法

1. 鸡兔同笼问题&#xff0c;鸡有2只脚 &#xff0c;兔有4只脚&#xff0c;已知脚数求最多有几只动物 #include <stdio.h>void feet(int x){if(x%2 0){if(x%4 0) printf("max%d,min%d",x/2,x/4);else printf("max%d,min%d",x/2,(x-2)/41);}else …

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

概率论的基本知识

逆概率还不懂&#xff0c;改天再想想。 联合概率 联合概率&#xff08;Joint Probability&#xff09; 是概率论中的一个重要概念&#xff0c;用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。