【C++】标准库类型string

🦄个人主页:修修修也

🎏所属专栏:C++

⚙️操作环境:Visual Studio 2022


string类简介

        在实际开发中会经常使用字符串,所谓的字符串就是指一连串的字符,它由许多单个字符连接而成。字符串中可以包含任意任意字符,这些字符必须包含在一对英文双引号( " " )之内,例如"abc"。C++中定义了String类来封装字符串,并提供了一系列操作字符串的方法,它们都位于<string>头文件中。

        我们先来看一下https://legacy.cplusplus.com/网站对string类的文档介绍:string类文档

总结如下:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,即:
    typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列。
  5. 在使用string类时,必须包含#include头文件以及using namespace std;

string类常用接口(成员函数)

📌string类对象默认成员函数

🎏string类对象构造函数

        如下,C++98标准中对于string类实现了7个重载的构造函数:string类查询文档

        其参数解析如下:

         接下来我们演示使用如下四种常见的string类构造函数:

函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char* s)用C-string来构造string类对象
string(size_t n,char c)string类对象中包含n个字符c
string(const string&s)拷贝构造函数

        如下代码,分别按上述构造函数顺序调用了相应构造函数初始化了4个string类对象:

#include<iostream>
#include<string>using namespace std;int main()
{//构造空的string类对象,即空字符串string s1;//用C-string来构造string类对象string s2("hello world");//string类对象中包含n个字符cstring s3(5, 'x');//拷贝构造函数string s4(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;return 0;
}

        运行程序,构造类对象效果如下:


🎏string类对象析构函数

        如下,C++中对于string类实现了1个析构函数:

        该函数没有参数,没有返回值,在类对象生命周期结束后自动调用销毁类对象.


🎏string类对象赋值运算符重载函数

    如下,C++98标准中对于string类实现了3个重载的赋值运算符重载函数:

          接下来我们演示使用这三种常见的string类赋值运算符重载函数: 

          如下代码,分别按上述赋值运算符重载函数顺序调用了相应赋值运算符重载函数赋值了3次string类对象s4:

int main()
{//构造空的string类对象,即空字符串string s1;//用C-string来构造string类对象string s2("hello world");//string类对象中包含n个字符cstring s3(5, 'x');//拷贝构造函数string s4(s2);cout << s4 << endl;s4 = s3;cout << s4 << endl;s4 = "ABCDEF";cout << s4 << endl;s4 = 'Y';cout << s4 << endl;return 0;
}

          运行程序,赋值运算符重载效果如下:


📌string类对象的迭代遍历及元素访问操作

        string类对象的迭代器相关函数共有8个,如下:

        string类对象的元素访问相关函数共有四个,如下:

           接下来我们演示学习几种常见的string类对象的迭代遍历及元素访问函数:

函数名称功能说明
operator[]返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器
rbegin+rendbegin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器
范围forC++支持更简洁的范围for的新遍历方式

🎏operator[]运算符重载

operator[]运算符重载定义:operator[]文档链接


operator[]遍历string类对象:

#include<iostream>
#include<string>
using namespace std;int main()
{string st1("Hello world");for (size_t i = 0; i < st1.size(); i++){cout << st1[i] << endl;}return 0;
}

operator[]遍历效果如下:


operator[]修改string类对象:

        因为operator[]返回的是引用类型,因此可以利用其对string对象进行修改:

int main()
{string st1("Hello world");for (size_t i = 0; i < st1.size(); i++){++st1[i];cout << st1[i] << endl;}return 0;
}


operator[]重载访问string类对象和内置类型访问数组成员的区别:


🎏顺序迭代器begin+end

begin+end迭代器顺序遍历访问字符串:

begin()函数定义如下:

end()函数定义如下:


begin+end迭代器顺序遍历访问string类对象:

int main()
{string st1("Hello world");//迭代器string::iterator it = st1.begin();while (it != st1.end()){cout << *it << endl;++it;}return 0;
}

begin+end迭代器顺序遍历访问效果如下:


begin+end迭代器修改string类对象:

int main()
{string st1("Hello world");//迭代器string::iterator it = st1.begin();while (it != st1.end()){++(*it);cout << *it << endl;++it;}return 0;
}

begin+end迭代器修改string类对象效果如下:


🎏反向迭代器rbegin+rend

rbegin+rend逆序遍历访问string类对象:

rbegin()函数定义如下:

rend()函数定义如下:


使用rbegin+rend迭代器反向遍历访问string类对象:

int main()
{string st1("Hello world");//反向迭代器string::reverse_iterator rit = st1.rbegin();while (rit != st1.rend()){cout << *rit << endl;++rit;}return 0;
}

rbegin+rend迭代器反向遍历访问string类对象效果如下:


使用rbegin+rend反向迭代器修改string类对象:

int main()
{string st1("Hello world");//反向迭代器string::reverse_iterator rit = st1.rbegin();while (rit != st1.rend()){++(*rit);cout << *rit << endl;++rit;}return 0;
}

rbegin+rend反向迭代器修改string类对象效果如下:


🎏范围for  

        C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量, 第二部分则表示被迭代的范围。(注:知道数据类型的情况下可以不使用auto关键字自动推导类型)


范围for顺序访问string类对象:

int main()
{string st1("Hello world");for (auto ch : st1){cout << ch << endl;}return 0;
}

范围for顺序访问string类对象效果如下:


范围for修改string类对象:

int main()
{string st1("Hello world");for (auto &ch : st1){ch++;cout << ch << endl;}return 0;
}

范围for修改string类对象效果如下:


注:范围for在底层会替换成迭代器!


string类对象的容量操作

        string类对象容量相关操作函数共有9个,如下:

            接下来我们演示学习几种常见的string类对象的容量操作函数:

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty检测字符串释放为空串,是返回true,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数改成n个,多出的空间用字符c填充

🎏size()函数

size()函数定义:


使用size()函数获取字符串有效字符长度:

int main()
{string st1("Hello world");cout << st1.size() << endl;return 0;
}

size()函数效果如下:

🎏length()函数

length()函数定义:


使用length()函数获取字符串有效字符长度

int main()
{string st1("Hello world");cout << st1.length() << endl;return 0;
}

length()函数效果如下:

🎏capacity()函数

capacity()函数定义:


使用cipacity()函数获取string类对象当前存储空间总大小:

int main()
{string st1("Hello world");cout << st1.size() << endl;cout << st1.capacity() << endl;return 0;
}

capacity()函数效果如下:


关于capacity:

  • 不同的编译器底层实现的扩容机制不同,vs初始长度为16,第一次扩容2倍,剩余每次扩容1.5倍;Linux初始长度按初始化的字符串来确定,之后每次扩容2倍

🎏empyt()函数

empty()函数定义:


使用empty()函数判断字符串是否为空串:

int main()
{string st1("Hello world");string st2;cout << st1.empty() << endl;cout << st2.empty() << endl;return 0;
}

empty()函数效果如下:

🎏clear()函数

clear()函数定义:


使用clear()函数清空字符串:

int main()
{string st1("Hello world");cout << st1.empty() << endl;st1.clear();cout << st1.empty() << endl;return 0;
}

clear()函数效果如下:


clear对size和capacity的影响:

int main()
{string st1("Hello world");cout << st1.size() << endl;cout << st1.capacity() << endl;st1.clear();cout << st1.size() << endl;cout << st1.capacity() << endl;return 0;
}

结论是:

        一般而言,clear的改变会让size变成0,但不会影响capacity,因为要缩小容量,就需要重新再开辟空间,代价消耗太大,因此一般不会轻易改变capacity的大小:

reserve()函数

reserve()函数定义:

使用reserve()函数更改类对象容量:

reserve()函数效果如下:

resize()函数

resize()函数定义:

使用resize()函数调整字符串大小:

resize()函数效果如下:

注意:

  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不会改变容量大小。

string类对象的字符串修改操作

        string类对象的字符串修改函数共有21个,如下:

常用的字符串修改操作:

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find+nops从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回


string类的非成员函数

        非成员函数重载共有6个,如下:

常用的非成员函数

函数名称功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较


结语

希望这篇关于C++string类的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【C++】构建第一个C++类:Date类

【C++】类的六大默认成员函数及其特性(万字详解)

【C++】内联函数

【C++】函数重载

【C++】什么是类与对象?

【C++】缺省参数(默认参数)

【C++】命名空间

【C++】“Hello World!“



我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=33fhaifmbw00o

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

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

相关文章

论文笔记:基于多粒度信息融合的社交媒体多模态假新闻检测

整理了ICMR2023 Multi-modal Fake News Detection on Social Media via Multi-grained Information Fusion&#xff09;论文的阅读笔记 背景模型实验 背景 在假新闻检测领域&#xff0c;目前的方法主要集中在文本和视觉特征的集成上&#xff0c;但不能有效地利用细粒度和粗粒度…

10.python的字典dict(上)

10.python的字典dict(上) 什么是字典 在计算机科学中&#xff0c;字典是一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pair&#xff09;的集合。每个键值对都由一个唯一的键和一个对应的值组成。字典能够快速地根据键找到对应的值&#xff0c;因此在很多编程…

Linux 常见性能分析方法论介绍(业务负载画像、下钻分析、USE方法论,检查清单)

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理内容涉及常用的性能调优方法论介绍&#xff1a;业务负载画像下钻分析USE方法论检查清单理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼…

二维码门楼牌管理应用平台建设:构建智慧社区新生态

文章目录 前言一、二维码门楼牌管理应用平台概述二、公益报名功能的实现方式三、二维码门楼牌管理应用平台在智慧社区建设中的作用四、结论与展望 前言 随着科技的快速发展&#xff0c;智慧城市建设已成为现代城市管理的重要方向。二维码门楼牌管理应用平台作为智慧社区建设的…

从零打造一款基于Nextjs+antd5.0的中后台管理系统

hi, 大家好&#xff0c;我是徐小夕&#xff0c;最近在研究nextjs, 为了更全面复盘总结nextjs&#xff0c; 我写了一个开箱即用的基于 next 的后台管理系统, 供大家学习参考. github地址&#xff1a;https://github.com/MrXujiang/next-admin 演示地址&#xff1a;http://next-a…

java AIO为什么用的并不多

Java AIO的本质是什么 原文&#xff1a;https://blog.csdn.net/hellojackjiang2011/article/details/131322757?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-131322757-blog-103915337.235%5Ev43%5Epc_blo…

python实验2

一、实验目的 掌握不同文件类型的读写掌握目录遍历的方法掌握json解析器的设计与实现 二、实验内容读取文件内容素数写入文件输出文件目录读写json文件实现json解析器 三、实验环境 在Educoder平台进行实验 四、实验要求 根据每个实训的每个关卡要求完成代码提交和测评 五、 实…

物联网实战--入门篇之(五)嵌入式-IIC驱动(SHT30温湿度)

目录 一、IIC简介 二、IIC驱动解析 三、SHT30驱动 四、总结 一、IIC简介 不管是IIC还是串口&#xff0c;亦或SPI&#xff0c;它们的本质区别在于有各自的规则&#xff0c;就是时序图&#xff1b;它们的相同点就是只要你理解了时序图&#xff0c;你就可以用最普通的IO引脚模…

RAG:检索增强生成系统如何工作

随着大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;人工智能世界取得了巨大的飞跃。经过大量数据的训练&#xff0c;LLM可以发现语言模式和关系&#xff0c;使人工智能工具能够生成更准确、与上下文相关的响应。 但LLM也给人工智能工程师带来了新的挑战&#xff…

SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

一、SRS OBS利用RTMP协议实现音视频推拉流 参考&#xff1a;https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1&#xff09;docker直接运行SRS服务&#xff1a; docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.co…

Chrome浏览器隐藏的截图功能配置及使用

来自实用又方便&#xff0c;轻松打开Chrome浏览器隐藏的截图功能&#xff01;​​​​​​​ 一、通过谷歌Chrome浏览器 现在直接通过谷歌Chrome浏览器内置功能&#xff0c;免安装扩充插件也可以实现Chrome的截图和长截图功能了&#xff01; 也不需要额外安装任何截图工具 &a…

蓝桥杯习题

https://www.lanqiao.cn/problems/1265/learning/ 第一题---排序 给定一个长度为N的数组A&#xff0c;请你先从小到大输出它的每个元素&#xff0c;再从大到小输出他的每个元素。 输入描述&#xff1a; 第一行包含一个整数N 第二行包含N个整数a1,a2,a3,...an&#xff0c;表…

Leaflet使用多面(MultiPolygon)进行遥感影像掩膜报错解决之道

目录 前言 一、问题初诊断 1、山重水复 2、柳暗花明 3、庖丁解牛 4、问题定位 二、解决多面掩膜问题 1、尝试数据修复 2、实际修复 3、最终效果 三、总结 前言 之前一篇讲解遥感影像掩膜实现&#xff1a;基于SpringBoot和Leaflet的行政区划地图掩膜效果实战&#xff0…

指针强化练习(详解)

更多学习内容 结构体内存对齐 和 位段-CSDN博客指针初级&#xff08;基础知识&#xff09;-CSDN博客指针进阶(深入理解)-CSDN博客 目录 1.sizeof与strlen的区别 2.一维数组 3.字符指针 4.二维数组 5.指针运算(笔试题) 6.函数指针 1.sizeof与strlen的区别 请思考以下运行结…

安装即启动?探索流氓App的自启动“黑科技” (Android系统内鬼之ContentProvider篇)

前段时间发现了一个神奇的app&#xff0c;它居然可以在安装之后立即自启动&#xff1a; 看到没有&#xff0c;在提示安装成功大概1到2秒后&#xff0c;就直接弹出Toast和通知了&#xff01; 好神奇啊&#xff0c;在没有第三方app帮忙唤醒的前提下&#xff0c;它是怎么做到首次安…

C++2D原创我的世界1.00.3版本上市!!!

我很郁闷&#xff0c;为什么就是整不了昼夜交替啊喂&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 虽然这看上去很简单&#xff0c;但做起来要我命&#xff01;&#xff01;&#xff01; 优化过后总共1312行&#xff0c…

DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧

遍历是指通过或遍历节点树 遍历节点树 通常&#xff0c;您想要循环一个 XML 文档&#xff0c;例如&#xff1a;当您想要提取每个元素的值时。 这被称为"遍历节点树"。 下面的示例循环遍历所有 <book> 的子节点&#xff0c;并显示它们的名称和值&#xff1a;…

Qt主窗口 之:停靠/悬浮窗口(QDockWidget)

一、QDockWidget概述 QDockWidget 是 Qt 中的一个窗口部件&#xff0c;用于创建可停靠的窗口&#xff0c;通常用于构建多文档接口&#xff08;MDI&#xff09;或可定制的用户界面。QDockWidget 允许用户将窗口停靠在应用程序的主窗口周围&#xff0c;或将其拖动到独立的浮动窗…

门控循环单元(GRU)

概述 门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;由Junyoung Chung等人于2014年提出&#xff0c;原论文为《Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling》。GRU是循环神经网络&#xff08;Recurrent Neural Network, …

实现富文本的三部曲

1、引入 ueditor.config.js ueditor.all.min.js lang/zh-cn/zh-cn.js 2、编辑器显示处 id"content" <textarea id"content" name"content"></textarea> 3、底部 <script type"text/javascript"> //实例化编辑器 …