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

【C++入门】C++ STL中string常用函数用法总结

目录

前言

 1. string使用

 2. string的常见构造

 3. string类对象的访问及遍历

  迭代器遍历:

 访问:

 4. string类对象的容量操作

4.1 size和length

 4.2 clear、empty和capacity

 4.3 reserve和resize

reserve

 resize

 5. string类对象的修改操作

 push_back

 operator+=

 c_str

 find

substr

 6. insert和erase

 insert

erase

总结


前言

        STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架,主要包含:算法、仿函数、迭代器、空间适配器、容器、适配器;六大组件,本无主要介绍的是STL容器中string常用函数的用法。

在这里插入图片描述

 1. string使用

          string是表示字符串的字符串类,它的接口与常规容器的接口基本相同,并且添加了一些专门用来操作string的常用接口,在刷题时也经常使用。

 使用string类时,必须包含#include<string>头文件以及using namespace std;

 2. string的常见构造

 C++的标准库版本不同,string构造方法也会有所不同

 详细可查阅:https://legacy.cplusplus.com/reference/string/string/string/

 无参构造:

string s1;

 字符构造:

//string str('x'); //这样不行
string s;
s = 'x'; // 也就是赋值运算符重载

 字符串常量构造:

string s2("hello world!");
string s2 = "hello world!";

 拷贝构造:

string s3 = s2; // 两种方法等价
string s4(s2);

 指定n个相同字符进行初始化:

// 接口原型:string (size_t n, char c)
string s6(10, 'x');//10个x初始化

 迭代器区间构造:

string s7 = "Hello World!";
// 创建一个迭代器区间,从第2个字符开始,到第11个字符结束
string s8(s7.begin() + 1, s7.begin() + 11); // ello World

 3. string类对象的访问及遍历

 

  迭代器遍历:

   begin和end:

  • begin返回指向字符串的第一个字符的迭代器
  • end返回指向字符串末尾的迭代器
string s1 = "Hello world!";
//迭代器
// iterator用法像指针
string::iterator it = s1.begin();
while (it != s1.end())
{cout << *it << " ";++it;
}

   反向遍历rbegin和rend:

  •  rbegin返回指向字符串最后一个字符(即其反向开头)的反向迭代器
  •  rend 返回一个反向迭代器,该迭代器指向字符串第一个字符(被视为其反向末尾)
auto it1 = str.rbegin();
while (it1 != str.rend())
{cout << *it1 << " ";++it1;
}

 范围for遍历:

for (auto e : s1)
{cout << e;
}

 访问:

 [ ]下标访问:

s1[1] = 'x';
cout << s1[1];

 4. string类对象的容量操作

 string类对象支持直接获取字符串长度,length和size都可以返回有效字符长度,size更通用;

4.1 size和length

string s = "Hello world!";// 12个字符
cout << s.size() << endl;  // 12
cout << s.length() << endl;// 12

 4.2 clear、empty和capacity

 注意:

  • clear后,使用empty会返回true
  • clear函数只将size清零
  • clear函数不会改变capacity

 使用非常简单便捷:

string s = "Hello world!";//VS环境下,扩容为1.5倍扩容,环境不同capacity结果可能不同
cout << s.capacity() << endl; // 15
cout << s.empty() << endl;    // 0 ->false
s.clear();
cout << s.empty() << endl;    // 1 ->true
cout << s.capacity() << endl; // 15

 4.3 reserve和resize

 reserve和resize有些相似都具有扩容的功能

reserve

reserve的主要功能就是开空间,为string对象预留空间,提前开好空间,减少扩容,提高效率

 环境不同开空间规则也不同

  • 在VS环境下为1.5倍扩容,初始容量是15
  •  g++环境下,从0开始二倍扩容
string s1 ;
cout << s1.capacity() << endl; // 15
s1.reserve(30);
cout << s1.capacity() << endl; // 31

reserve在一般的编译器中不具备缩容的功能(C++没有严格的去规定

 resize

 resize功能是改变字符串的size

string s = "Hello world!";
cout << s << endl;            // 输出:Hello world!
cout << s.size() << endl;     // 12
cout << s.capacity() << endl; // 15s.resize(40);
cout << s << endl;            // 输出:Hello world!
cout << s.size() << endl;     // 40
cout << s.capacity() << endl; // 47

 在没有给字符时,resize默认补的是\0.

string s = "Hello world!"; 
s.resize(15,'x'); // 输出:Hello world!xxx

这个功能也可以让它用来初始化string对象。

resize值小于字符串的size会删除字符串中的有效字符:

string s = "Hello world!"; 
cout << s << endl;
cout << s.size() << endl; // 12
cout << s.capacity() << endl; // 15s.resize(5); 
cout << s << endl;    //输出:Hello 
cout << s.size() << endl; // 5
cout << s.capacity() << endl; // 15

 5. string类对象的修改操作

 push_back

string s("abcde");
s.push_back('f');
s.push_back('g');

 operator+=

append使用的频率不高,主要使用+=;

string str1 = "Hello";
string str2 = "World";
str1 += str2; // 现在 str1 的值为 "HelloWorld"

 c_str

string str = "Hello";
const char* cstr = str.c_str(); // cstr 指向包含 "Hello" 的C风格字符串

c_str() 是C++中string 类的成员函数,它返回一个指向以空字符结尾的C风格字符串的指针,以便与需要C风格字符串作为参数的函数进行交互。

注意:

 返回的指针指向的字符串是只读的,不能用于修改

 find

find用于在字符串中查找子字符串的位置,如果找不到则返回 string::npos


string str = "Hello, World!";
size_t pos = str.find("World"); // pos 的值为 7

substr

substr用于从字符串中提取子字符串

//函数原型
string substr (size_t pos = 0, size_t len = npos) const;

 pos 是要提取的子字符串的起始位置,len 是要提取的子字符串的长度,默认值为 npos,表示提取从起始位置到字符串末尾的所有字符

string str = "Hello, World!";
string sub = str.substr(7, 5); // sub 的值为 "World"

 6. insert和erase

 insert

insert的函数原型种类很多,但最长用的也就是在指定位置插入单个字符、字符串、 一个string类对象等感兴趣可以去了解一下;

string str = "Hello!";
str.insert(5, " World"); // 现在 str 的值为 "Hello World!"

 当然它也支持使用迭代器插入数据

erase

 erase 函数用于从指定位置开始删除指定长度的字符函数原型:

string& erase (size_t pos = 0, size_t len = npos);

 它也支持使用迭代器区间删除数据

示例:

string str = "Hello, World!";
str.erase(7, 7); // 现在 str 的值为 "Hello, "

总结

        本文主要是string类常用接口的总结,string发布时间早于STL,在最初设计时实现的功能丰富,接口繁多也较为复杂,STL库函数中很多接口都十分相似,学习了string后会对vector和list等等容器的学习有帮助,以上便是本文全部内容,希望对你有所帮助,感谢阅读!

相关文章:

【C++入门】C++ STL中string常用函数用法总结

目录 前言 1. string使用 2. string的常见构造 3. string类对象的访问及遍历 迭代器遍历&#xff1a; 访问&#xff1a; 4. string类对象的容量操作 4.1 size和length 4.2 clear、empty和capacity 4.3 reserve和resize reserve resize 5. string类对象的修改操作 push_back o…...

Rust变量、常量声明与基本数据类型

Rust是一门系统级别的编程语言&#xff0c;注重安全性、性能和并发。在这篇博客中&#xff0c;我们将介绍Rust中的变量、常量声明以及基本数据类型&#xff0c;并通过示例说明每一种类型的用法。 变量声明 在Rust中&#xff0c;使用 let 关键字声明变量。变量默认是不可变的&…...

【MATLAB】 SSA奇异谱分析信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 SSA奇异谱分析&#xff08;Singular Spectrum Analysis&#xff09;是一种处理非线性时间序列数据的方法&#xff0c;可以对时间序列进行分析和预测。 它基于构造在时间序列上的特定矩阵的奇异值分解&#…...

Nginx+Tomcat负载均衡、动静分离以及Nginx负载均衡和四层代理

目录 NginxTomcat负载均衡、动静分离 Nginx 负载均衡模式&#xff1a; Nginx 四层代理配置&#xff1a; NginxTomcat负载均衡、动静分离 Nginx 服务器&#xff1a;192.168.80.10:80 Tomcat服务器1&#xff1a;192.168.80.100:80 Tomcat服务器2&#xff1a;192.168.80.101:80…...

Vue3中provide,inject使用

一&#xff0c;provide,inject使用&#xff1a; 应用场景&#xff1a;向孙组件传数据 应用Vue3碎片&#xff1a; ref&#xff0c;reactive&#xff0c;isRef&#xff0c;provide, inject 1.provide,inject使用 a.爷组件引入 import {ref,provide} from vue const drinkListre…...

Django命令模块

这篇文章我们主要来介绍一下关于 Django 的命令模块&#xff0c;我们经常会使用到&#xff0c;比如以下几个常用的命令&#xff0c;都属于 Django 的命令模块&#xff1a; python manage.py makemigrations python manage.py migrate python manage.py startapp python manage…...

【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

文章目录 注册杂项设备驱动模块传参注册字符设备 开发环境&#xff1a; windows ubuntu18.04 迅为rk3568开发板 注册杂项设备 相较于字符设备&#xff0c;杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10&#xff0c;在系统中注册多个 misc 设备驱动时&…...

Golang条件编译 | 获取系统的磁盘空间内存占用demo | gopsutil/disk库(跨平台方案)

文章目录 一、Golang条件编译1. 构建标签( Build tags)2. 文件后缀&#xff08;File suffixes&#xff09; 二、GO golang 获取磁盘空间 条件编译思路 三、【推荐】使用github.com/shirou/gopsutil/disk这个库&#xff0c;如何获取机器下不同磁盘分区的内容 一、Golang条件编译…...

22/76-池化

池化&#xff08;最大池化层&#xff1a;选每个kernel中最大的数&#xff09; 填充、步幅、多个通道&#xff1a; 池化层与卷积层类似&#xff0c;都具有填充和步幅。 没有可学习的参数。 在每个输入通道应用池化层以获得相应的输出通道。 输出通道数输入通道数。 平均池化层…...

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2C(mpu6050陀螺仪和加速度计)SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR1…...

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…...

2024年第十届控制、自动化与机器人国际会议(ICCAR 2024)即将召开!

2024年4月27~29日 新加披 会议官网&#xff1a;10th-ICCAR 2024https://iccar.org/index.html 第十届控制、自动化和机器人国际会议将于2024年4月27-29日在新加坡举办。本次会议由新加坡电子学会&#xff0c;IEEE机器人和自动控制协会和IEEE联合主办&#xff0c;并得到北京航空…...

基于python集成学习算法XGBoost农业数据可视化分析预测系统

文章目录 基于python集成学习算法XGBoost农业数据可视化分析预测系统一、项目简介二、开发环境三、项目技术四、功能结构五、功能实现模型构建封装类用于网格调参训练模型系统可视化数据请求接口模型评分 0.5*mse 六、系统实现七、总结 基于python集成学习算法XGBoost农业数据可…...

第29集《佛法修学概要》

丁三、声闻乘 分二&#xff1a;戊一、释义&#xff1b;戊二、四谛法&#xff1b;戊三、结示 请大家打开讲义第八十二页。我们看丁三&#xff0c;声闻乘。 在祖师大德的判教当中&#xff0c;把我们整个大乘的成佛之道分成了三个部分&#xff1a;第一个是安乐道&#xff0c;第…...

奥伦德光电耦合器5G通信领域及其相关领域推荐

光电耦合器是以光为媒介传输电信号的一种电-光-电转换器件。由于该器件使用寿命长、工作温度范围宽&#xff0c;所以在过程控制、工业通信、家用电器、医疗设备、通信设备、计算机以及精密仪器等方面有着广泛应用在当前工艺技术持续发展与提升的过程中&#xff0c;其工作速度、…...

机器学习算法 - 马尔可夫链

马尔可夫链&#xff08;Markov Chain&#xff09;可以说是机器学习和人工智能的基石&#xff0c;在强化学习、自然语言处理、金融领域、天气预测、语音识别方面都有着极其广泛的应用 > The future is independent of the past given the present 未来独立于过去&#xff…...

Linux下防火墙相关命令整理

目录 一.前言二.相关命令整理 一.前言 这篇文章简单整理一下Linux系统中防火墙相关命令。 二.相关命令整理 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld重启防火墙 systemctl restart firewalld开机启用防火墙 systemctl enable firewall…...

Python八股文总结

一. Python基本数据结构有哪四种&#xff1f;区别是什么&#xff1f; 列表&#xff08;List&#xff09;元组&#xff08;Tuple&#xff09;字典&#xff08;Dictionary&#xff09;集合&#xff08;Set&#xff09; 区别主要在于它们的可变性&#xff08;是否可以修改&#x…...

计算机导论05-计算机网络

文章目录 计算机网络基础计算机网络概述计算机网络的概念计算机网络的功能计算机网络的组成 计算机网络的发展计算机网络的类型 网络体系结构网络互联模型OSI/RM结构与功能TCP/IP结构模型TCP/IP与OSI/RM的比较 网络地址与分配IP地址构成子网的划分IPv6 传输介质与网络设备网络传…...

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...