【C++】string类的使用①(默认成员函数 || 迭代器接口begin,end,rbegin和rend)

在这里插入图片描述

🔥个人主页: Forcible Bug Maker
🔥专栏: STL || C++

目录

  • 前言
  • 🌈关于string类
  • 🌈string类的成员函数
    • 🔥默认成员函数
      • ==string类对象的构造(constructor)==
      • ==string类对象的析构==
      • ==string类对象的赋值运算符重载==
    • 🔥迭代器接口(iterators)
      • ==begin==
      • ==end==
      • ==rbegin==
      • ==rend==
      • ==cbgin,cend,erbegin和crend==
  • 结语

前言

本篇博客主要内容:STL库中string类的默认成员函数和各种迭代器接口的介绍和使用

在开始我们string类使用接口的讲解之前,想先讲讲为什么我们要学习string类。在C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

简单说,string就是C++STL标准库中便于维护和操作字符串的一个类

学习STL过程中,我们主要参考这个网站中的文档:https://cplusplus.com,虽然里面的内容是全英的,但是不用担心,我会带着大家一一去翻译并讲解其中的接口。

🌈关于string类

在这里插入图片描述
字符串是表示字符序列的类。

标准的字符串提供了此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。

string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(关于模板更多的信息,请参考basic_string)。

请注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

对以上文字做一个总结:

  1. string是表示字符串的类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string类再底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,alloctor> string;
  4. 不能操作多字节或变长字节的序列。

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

🌈string类的成员函数

C++STL库的string类中重载的成员函数非常之多,但并不是每个接口都有着其必要性。string类是C++中最先被开发和实验的类,由于向前兼容等各种原因,其实其中也不免存在一些函数的冗余,在上百个重载的接口中,真正常用的也就是那十几二十个。对于一些相同道理的重载,我会做简单解释而不会展开讲,避免文章内容的冗余。

🔥默认成员函数

在这里插入图片描述

string类对象的构造(constructor)

在这里插入图片描述
string类提供了七种方式的重载用于构造string类对象。
(1)无参构造(默认构造)
string();
构造出一个空的string,里面存储0个字符元素。
(2)拷贝构造
string(const string& str);
构造出一个和str对象内容相同的拷贝对象。
(3)字串构造
string (const string& str, size_t pos, size_t len = npos);
拷贝str从pos位置开始跨越len个长度的元素到新创建的对象中(如果字符串太短未提供第三个参数,直接从pos位置拷贝到字符串的末尾)。
(4)通过字符串构造
string (const char* s);
通过s指向的以 空字符(‘\0’) 结尾的字符串创建新的string类型的对象。
(5)通过部分字符串构造
string (const char* s, size_t n);
从s指向的字符串中拷贝前n个字符创建新的string类型的对象。
(6)字符填充构造
string (size_t n, char c);
用连续的n个c构成的串创建string类型的对象。
(7)迭代器区间构造
template <class InputIterator>
string (InputIterator first, InputIterator last);
通过迭代器区间 [first,last) 之间的元素,创建顺序相同的新string对象。

你现在可能不知道迭代器是什么,不过你可以先将它理解成是一种指针,指向string中的元素,可以通过++或–来改变这种指针的指向。

使用样例:

// string类的构造
#include <iostream>
#include <string>
// 由于下面使用了std::,所以此处不用命名空间展开
int main()
{std::string s0("Initial string");// constructors used in the same order as described above:std::string s1;std::string s2(s0);std::string s3(s0, 8, 3);std::string s4("A character sequence");std::string s5("Another character sequence", 12);std::string s6a(10, 'x');std::string s6b(10, 42);      // 42是字符'*'的ASCII码值std::string s7(s0.begin(), s0.begin() + 7);// 打印构造出来的字符串内容,这里重载了流插入>>和流提取<<运算符。std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';return 0;
}

在这里插入图片描述

string类对象的析构

在这里插入图片描述
如你所见,析构只有一种,之前在类和对象篇已经讲过了,析构函数是不能重载的。
析构函数编译器会自动调用,释放资源,所以就不需要你操心了。

string类对象的赋值运算符重载

在这里插入图片描述
string类提供了三种赋值运算符重载,用于给已经创建好的对象赋值。
(1)string对象赋值
string& operator=(const string& str);
将str的内容拷贝到被赋值的对象中。
返回值:被赋值对象(*this)的引用。
(2)字符串赋值
string& operator=(const char* s);
通过一个已有的字符串给string赋值,其实不重载此函数也可以达到效果(隐式类型转换),但是考虑到隐式类型转换是有效率损耗的,故标准库中还是重载了此成员函数。
返回值:被赋值对象(*this)的引用。
(3)字符赋值
string& operator=(char c);
将字符直接赋值给串。
返回值:被赋值对象(*this)的引用。

使用样例:

#include <iostream>
#include <string>
using namespace std;
int main()
{std::string str1, str2, str3;str1 = "Test string. ";   // c-stringstr2 = str1; //stringstr3 = 'x'; //charcout << str1 << endl;cout << str2 << endl;cout << str3 << endl;return 0;
}

在这里插入图片描述

🔥迭代器接口(iterators)

在这里插入图片描述
什么是迭代器接口,就是成员函数返回迭代器的接口,也就是获取迭代器的方法。
我们可以先将迭代器想象成指向容器元素的指针,而这些成员函数的作用就是让我们获取这些指针。同时我们可以通过+,-,++或–等运算符调整这种指针的指向。

begin

在这里插入图片描述
iterator begin();
const_iterator begin() const;
这两个成员函数都返回一个指向string串中第一个元素的正向迭代器。

end

在这里插入图片描述
iterator end();
const_iterator end() const;
这两个成员函数都返回一个指向string串中最后一个元素下一位的正向迭代器。

使用样例:

// string::begin/end
#include <iostream>
#include <string>
using namespace std;
int main()
{std::string str("Test string");string::iterator it = str.begin();for (; it != str.end(); ++it)cout << *it;cout << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述
string的迭代器(iterator)是一个定义在string类内部的一个类型,它能指向string对象的元素,而迭代器的对象可以通过string提供的成员函数获取。上述代码案例中的迭代器it被我们称为正向迭代器,++使其向后移动指向下一元素,–使其向前移动指向上一元素
而接下来我们要讲的rbegin和rend,是获取反向迭代器的两个接口函数。

rbegin

在这里插入图片描述
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
这两个成员函数都返回一个指向string串中最后一个元素的反向迭代器。

rend

在这里插入图片描述
reverse_iterator rend();
const_reverse_iterator rend() const;

这两个成员函数都返回一个指向string串中第一个元素上一位的反向迭代器。
使用样例:

// string::rbegin/rend
#include <iostream>
#include <string>
using namespace std;
int main()
{string str("now step live...");string::reverse_iterator rit = str.rbegin();for (; rit != str.rend(); ++rit)cout << *rit;cout << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述
同理,string的反向迭代器(reverse_iterator)是一个定义在string类内部的一个类型,它能指向string对象的元素,而反向迭代器的对象可以通过string提供的成员函数获取。反向迭代器,++使其向前移动指向上一元素,–使其后前移动指向下一元素

cbgin,cend,erbegin和crend

这几个作为C++11新增语法,专门提供了获取const类型的四种迭代器接口,使迭代器可以读,但不能通过迭代器解引用更改串中的内容。这里就不多做赘述。

结语

本篇博客讲了关于string类构造的七种重载,赋值运算符的三种重载,以及各种string迭代器接口的使用。后面博主会继续分享关于string类的使用以及STL更多的内容,感谢大家的支持。♥

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

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

相关文章

NPOI生成word浮动图标

1、NPOI版本2.7.0, net框架4.8 2、安装OpenXMLSDKToolV25.msi 3、先创建一个word文档&#xff0c;并设置图片为浮于文字之上 4、OpenXML显示的结果 5、实际代码如下&#xff1a; public class GenerateWordDemo {public GenerateWordDemo(){}//https://blog.fileformat.co…

前端笔记-day03

文章目录 01-初始CSS02-CSS引入方式03-标签选择器04-类选择器05-id选择器06-通配符选择器07-画盒子08-字体大小09-文字粗细10-字体倾斜11-行高12-行高垂直居中13-字体族14-font复合属性15-文本缩进16-文本对齐方式17-图片对齐方式18-文本修饰线19-文字颜色20-调试工具21-综合案…

Dual Aggregation Transformer for Image Super-Resolution论文总结

题目&#xff1a;Dual Aggregation Transformer&#xff08;双聚合Transformer&#xff09; for Image Super-Resolution&#xff08;图像超分辨&#xff09; 论文&#xff08;ICCV&#xff09;&#xff1a;Chen_Dual_Aggregation_Transformer_for_Image_Super-Resolution_ICCV…

IM 是什么?

在当今数字化的时代&#xff0c;即时通讯&#xff08;IM&#xff09;已经渗透到人们的日常生活和企业的工作环境中。IM技术的快速i发展为人们提供了一种高效、便捷的沟通方式&#xff0c;不仅推动了社会的信息化进程&#xff0c;也提升了企业的协同效率和竞争力。 作为企业级I…

【GD32】01-GPIO通用输入输出

GD32 闲话说在前头 这里又开一个系列啦。 原因就是之前买了立创开发板的9.9的GD32E230C8T6的板子&#xff0c;买都买了就跟着立创开发板学习一下&#xff08;属于是一次性支持了两个国产品牌了&#xff0c;立创和兆易创新&#xff09;。并且我还买了GD32F407VET6的板子&…

C++:关于圆形鱼眼半全景图转为等距圆柱投影图

C&#xff1a;空间坐标映射到球面坐标/全景图_如何将球体坐标映射到球面uv-CSDN博客 C&#xff1a;关于360全景图像和立方体6面全景图像的相互转换_彩色全景拆解正方体6个面-CSDN博客 之前记录了立方体和360全景之间的转换&#xff0c;这次记录下鱼眼图与360全景图之间的转换…

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…

软件体系结构总结

文章目录 一、软件体系结构概述1.1 基本概念1.1.1 背景1.1.2 定义1.1.3 系统1.1.3.1 定义1.1.3.2 特性1.1.3.3 系统的体系结构 1.1.4 软件设计的层次性1.1.5 体系结构的类别&#xff08;类型&#xff09;1.1.6 重要性&#xff08;意义&#xff09; 1.2 模块及其设计1.2.1 定义1…

HTTP超时时间设置

在进行超时时间设置之前我们需要了解一次http请求经历的过程 浏览器进行DNS域名解析&#xff0c;得到对应的IP地址根据这个IP&#xff0c;找到对应的服务器建立连接&#xff08;三次握手&#xff09;建立TCP连接后发起HTTP请求&#xff08;一个完整的http请求报文&#xff09;服…

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是…

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

Stable Diffusion教程|图生图原理和实战

Stable Diffusion凭借其卓越的图生图功能&#xff0c;极大地提升了图像生成的可控性与输出品质&#xff0c;赋予用户前所未有的个性化创作风格表达能力。这一革新特性使得Stable Diffusion不仅能精准地捕捉用户的艺术愿景&#xff0c;更能以数字化手段孕育出新颖且极具创意的画…

【Java 8】Lambda: mAA::get 返回函数式接口实例

正文 代码介绍&#xff1a;分别有两个函数式接口Lazy跟LazyDependencyCreator&#xff0c;一个HashMap存储<Object, LazyDependencyCreator>键值对。重点在于mProviders.put(AA.class,mAA::get)&#xff0c;看了很久都没看懂&#xff0c;mAA::get返回的不是mAA本身吗&am…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…

使用J-Link Commander / JFlash 烧写固件程序(以STM32F103C8T6为例)

使用JFlash 烧写流程 运行JFlash, 点击Project Settings 配置Jlink为SWD方式,选择连接设备为STM32F103C8T6, 点击确定. 选择要烧录的Bin文件 设置bin文件烧录地址, 点击OK(地址要在0x08000000-0x0800FFFF范围内) Note : STM32F103C8T6 Flash大小为 64KB&#xff0c; 地址范围…

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处&#xff1a; 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化&#xff1b; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

八. Django项目之电商购物商城 -- 添加邮箱

Django项目之电商购物商城 – 添加邮箱 一. 用户中心 添加邮箱功能在用户中心中 , 先完善用户中心功能 1. 视图 # 用户中心 class UserInfoCenterView(LoginRequiredMixin,View):def get(self , request):context {username : request.user.username,mobile : request.use…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …

20240507 ubuntu20.04+ros noetic 跑通lioslam

任务&#xff1a;跑通lioslam 主要参考博客 IMU激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程_ubuntu_AIDE回归线-GitCode 开源社区 (csdn.net) 1.不要用这一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…