【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-string
	str2 = str1; //string
	str3 = 'x'; //char

	cout << 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更多的内容,感谢大家的支持。♥

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库核心面试题

数据库中的引擎 常用的引擎有InnoDB、MyIsam、Memory三种。 MyIsam&#xff1a;组织形式分为三种&#xff1a; frm文件存储表结构、MyData文件存储表中的数据、MyIndex文件存储表的索引数据。是分开存储的。 Memory&#xff1a;基于内存的&#xff0c;访问速度快&#xff0…

【C++】 C++ 编写 鸡兔同笼程序

文章目录 “鸡兔同笼”问题是一个经典的数学问题&#xff0c;要求根据总头数和总腿数来计算鸡和兔的数量。假设鸡有 2 条腿&#xff0c;兔有 4 条腿。可以通过以下步骤求解这个问题&#xff1a; 1 .设鸡的数量为 x&#xff0c;兔的数量为 y。2.根据题意&#xff0c;我们有以下…

#私密朋友圈被吐槽有bug?官方致歉!网友:尴尬了......

1月7日&#xff0c;话题#微信私密朋友圈被吐槽有bug#&#xff0c;冲上微博热搜第一。 据了解&#xff0c;近日有网友发现&#xff0c;即使自己发布私密朋友圈&#xff0c;好友也可以在朋友圈页面看到自己的头像红点&#xff0c;随即此话题引发热议。 有网友表示&#xff0c;怪…

STL----resize

resize的作用 设置容器元素个数和初始值。 resize和reserve resize即改变容器元素个数&#xff0c;也改变容器容量。 reserve只改变容器容量&#xff0c;不改变容器元素个数。 reserve有什么用 reserve---存储&#xff0c;容量&#xff0c;保留。 1&#xff0c;设置容器容…

分布式系统的一致性与共识算法(二)

Consitency 背景 如买最后一张车票&#xff0c;两个售票处分别通过某种方式确认过这张票的存在。这时&#xff0c;两家售票处几乎同时分别来了一个乘客要买这张票&#xff0c;从各自"观察"看来&#xff0c;自己一方的乘客都是先到的&#xff0c;这种情况下&#xf…

原子学习笔记7——FrameBuffer 应用编程

Frame 是帧的意思&#xff0c;buffer 是缓冲的意思&#xff0c;所以 Framebuffer 就是帧缓冲&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。 应用程序通过对 LCD 设备节点/dev/fb0&#xff08;假设 LCD 对应的设备节点是/dev/fb0&#xff09;…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听&#xff08;提高了信道利用率&#xff09;以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

同为科技详解智能PDU所应用的通信协议与接口

现如今&#xff0c;信息服务、AI人工智能的飞速发展与增长&#xff0c;全球正经历信息数据的爆炸。不仅数据量以惊人的速度增长&#xff0c;而且全球社会各行业对数据的依赖的程度也在日益增加。这些趋势使数据中心在全球都享有关键基础架构的地位。假设某个数据中心发生严重的…

【知识拓展】大白话说清楚:IP地址、子网掩码、网关、DNS等

前言 工作中常听别人说的本地网络是什么意思&#xff1f;同一网段又是什么意思&#xff1f;它俩有关系吗&#xff1f; 在工作中内经常会遇到相关的网络问题&#xff0c;涉及网络通信中一些常见的词汇&#xff0c;如IP地址、子网掩码、网关和DNS等。具体一点&#xff1a;经常会…

JavaEE之线程(5)——Java内存模型、内存可见性、volatile关键字

前言 volatile可以理解成轻量级的 synchronized&#xff0c; 它在多CPU开发中保证了共享变量的“可见性”&#xff0c;可见性我们可以理解成是&#xff1a;当一个线程修改一个共享变量时&#xff0c;另一个线程可以读到这个修改的值。由于它不会引起线程的上下文切换和调度&am…

【JavaWeb】Day77.Spring——SpringBoot原理(一)

SpringBoot原理 Spring是目前世界上最流行的Java框架&#xff0c;它可以帮助我们更加快速、更加容易的来构建Java项目。而在Spring家族当中提供了很多优秀的框架&#xff0c;而所有的框架都是基于一个基础框架的SpringFramework(也就是Spring框架)。而如果我们直接基于Spring框…

【Shell】Shell编程之函数

目录 1.Shell函数定义 2.Shell函数的作用 3.函数返回值 4.函数传参 5.函数变量的作用范围 案例 1.Shell函数定义 格式1 function 函数名 { 命令序列 } 格式2 函数名() { 命令序列 } 2.Shell函数的作用 使用函数可以避免代码重复 使用函数可以将大的工程分割为若…

springcloud简单了解及上手

springcloud微服务框架简单上手 文章目录 springcloud微服务框架简单上手一、SpringCloud简单介绍1.1 单体架构1.2 分布式架构1.3 微服务 二、SpringCloud与SpringBoot的版本对应关系2022.x 分支2021.x 分支2.2.x 分支 三、Nacos注册中心3.1 认识和安装Nacos3.2 配置Nacos3.3 n…

【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 Cortex-M7 Debug eventDebug events Cortex-M7 Debug event 在ARM Cortex-M7架构中&#xff0c;调试事件&#xff08;Debug Event&#xff09;是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生&#xff1a; 进…

部署管理征信链码

一 . 链码准备 需要删除上面后面标记的文件&#xff0c;之后拖入 二. 打包链码 注意需要先启动链 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/credit_chaincode --lang n…

vue3.0(五) reactive全家桶

文章目录 1 reactive1.1 reactive的应用1.2 reactive的特点1.3 reactive的注意1.4 reactive的局限性 2 toRefs3 isReactive4 shallowReactive5 readonly5.1 readonly 详细信息5.2 readonly函数创建一个只读的响应式对象5.3 如何修改嵌套在只读响应式对象中的对象? 6 isReadonl…

考研数学|李林《880》做不动,怎么办!?看这一篇!

在考研数学的备考过程中&#xff0c;遇到难题是很常见的情况&#xff0c;尤其是当你尝试解决李林880习题集中的问题时。他以其难度和深度著称&#xff0c;旨在帮助考生深入理解数学分析的复杂概念。 如果你在解题过程中感到困难&#xff0c;这并不是你个人的问题&#xff0c;而…

《无畏契约》游戏画面出现“撕裂感“,你清楚背后的原理吗?

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

安全风险 - 如何解决 setAccessible(true) 带来的安全风险?

可能每款成熟的金融app上架前都会经过层层安全检测才能执行上架&#xff0c;所以我隔三差五就能看到安全检测报告中提到的问题&#xff0c;根据问题的不同级别&#xff0c;处理的优先级也有所不同&#xff0c;此次讲的主要是一个 “轻度问题” &#xff0c;个人认为属于那种可改…

[译文] 恶意代码分析:2.LNK文件伪装成证书传播RokRAT恶意软件(含无文件攻击)

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…