C++STL详解(一)——string类的接口详解(下)

news2024/11/15 11:39:44

目录

一.string的大小和容量成员函数

1.1size()和length()

1.2capacity()

1.3resize()

 1.4reserve()

1.5clear()和empty()

​编辑 二.string元素的访问

2.1operator[]和at()

2.2范围for

三.string中迭代器相关函数

3.1begin()和end()

3.2rbegin()和rend()

四.string与字符串之间的转换

五.string中子串的提取

5.1substr()

5.2通过copy()提取子串。

六.string中的运算符重载

6.1operator+操作符

6.2输入输出操作符

七.string中getline函数

 八.后记


一.string的大小和容量成员函数

1.1size()和length()

在C语言中,我们可以通过下式来计算字符数组中有多少个元素

	sizeof(arr[0]) / sizeof(arr);

在string库中,有如下两个接口可以计算元素个数:

	size();
	length();

如下图所示:

虽然这两个函数都可以完成对元素个数的计算,但我们更推荐使用size()函数计算元素的个数。

这是因为在STL中,都重载了size()这个函数,却没有重载length()函数。

1.2capacity()

capacity()函数用来获取字符串开的空间。

size_t capacity() const;

在这里需要大家注意的是,capacity表示开辟的空间大小,而size求出的是开辟的空间内的元素个数。因此这两个数是可以不相等的。

 如下图:

我们发现,我们开了15个空间存储这个字符串,但是只用了其中的七个空间。 

1.3resize()

resize是改变当前字符串有效字符个数的函数。 

void resize (size_t n);
void resize (size_t n, char c);

resize规则:

  • 当n大于对象当前的size时,将size扩大到n,扩大的字符为c,若c未给出,则默认为’\0’。
  • 当n小于对象当前的size时,将size缩小到n。 

我们可以通过下图的代码来验证上述规则: 

另外,值得一提的是,如果resize给出的值大于capacity的值的话,会调用扩容函数。

 1.4reserve()

reserve()是操作设置capacity的函数。函数原型如下:

void reserve (size_t n = 0);

 reserve规则:

  • 当n大于对象当前的capacity时,将capacity扩大到n或大于n。
  • 当n小于对象当前的capacity时,将capacity缩小或什么也不做。

我们可以通过下图来验证上图的规则:

这里需要我们大家注意两点内容

  1. reserer()函数并不会影响到字符串内的字符数据。
  2. reserve()在一些编译器中也可能会缩容。 

1.5clear()和empty()

clear()函数用来清空字符串内的字符数据。 

void clear();

clear规则:

  • 字符数据清除掉,使其成为空字符串
  • size设置为0 

实例如下: 

 empty函数进行判空,即判断字符串是否为空字符串。

bool empty() const;

如果字符串为空的话,则返回真。

如果字符串不为空的话,则返回假。

 
二.string元素的访问

2.1operator[]和at()

string元素的访问有两种方式,我们可以通过重载的[]访问,也可以通过at函数访问。

   char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
   char& at (size_t pos);
const char& at (size_t pos) const;

由于两者都是传引用返回,因此两者都可以修改数据。

我们先使用operator[]来进行实践: 

现在我们通过at来进行实践:

  

2.2范围for

同样的,我们也可以通过范围for来访问和修改字符串内的数据。

我们可以使用下图中的方式来访问数据:

但是,在使用范围for修改数据时,则需要我们传引用了,否则e只是对象元素的拷贝,对e的修改不会影响到对象的元素。

因此,使用范围for修改数据的正确方法如下:

		for (auto& e : str)
		{
			e = 'x';
		}

三.string中迭代器相关函数

3.1begin()和end()

begin函数:返回一个指向字符串第一个字符的迭代器。

end函数:返回一个指向字符串结束字符的迭代器,即’\0’。

函数原型如下:

    iterator begin();
 const_iterator begin() const;
    iterator end();
 const_iterator end() const;

 我们同样可以通过迭代器来访问和修改数据,如下所示: 

string str("xiaoqiulaoshi");
string::iterator it1 = str.begin();
while (it1 != str.end())
{
	cout << *it1 << ' ';
	it1++;
}
cout << endl;//x i a o q i u l a o s h i
string::iterator it2 = str.begin();
while (it2 != str.end())
{
	*it2='x';
	it2++;
}
cout << str << endl;//xxxxxxxxxx

3.2rbegin()和rend()

在string库中,还提供了反向迭代器rbegin和rend。

rbegin函数:返回指向字符串最后一个字符的反向迭代器。

rend函数:返回指向字符串第一个字符前面的理论元素的反向迭代器。

函数原型如下:

    iterator rbegin();
 const_iterator rbegin() const;
    iterator rend();
 const_iterator rend() const;

为了方便大家理解,我们来画图表示rbegin和rend的指向。


四.string与字符串之间的转换

在学习过数据结构之后,我们知道实现一个string类,私有成员需要有char* 、size、capacity。

如果我们只需要char*的话,则可以通过c_str()函数来进行转换。

我们将c_str()转换过来的字符串称为C字符串/C风格字符串。也就是我们上文中说的字符序列。

函数原型如下: 

const char* c_str() const;

使用方法如下:

const char* str2 = s.c_str();


五.string中子串的提取

我们有两种方法提取子串,分别是通过substr提取以及通过copy出一个字符串的部分字符到另外一个字符串中。

5.1substr()

函数原型如下:

string substr (size_t pos = 0, size_t len = npos) const;

我们可以通过下面的代码提取子串: 

int main()
{	
    string s1("abcdef");
	string s2;

	//substr(pos, n)提取pos位置开始的n个字符序列作为返回值
	s2 = s1.substr(2, 4);
	cout << s2 << endl; //cdef
    return 0;
}

5.2通过copy()提取子串。

 函数原型如下:

size_t copy (char* s, size_t len, size_t pos = 0) const;

 我们可以通过如下方法来提取子串:

int main()
{
	string s("abcdef");
	char str[20];

	//copy(str, n, pos)复制pos位置开始的n个字符到str字符串
	size_t length = s.copy(str, 4, 2);
	//copy函数不会在复制内容的末尾附加'\0',需要手动加
	str[length] = '\0';
	cout << str << endl; //dcef
	return 0;
}


六.string中的运算符重载

我们在前面的内容中已经介绍了很多操作符,现在我们再介绍几个操作符。

6.1operator+操作符

operator+操作符和operator+=操作符的作用是类似的。

重载后的+操作符支持如下操作:

 string类 + string类
 string类 + 字符串
 字符串 + string类
 string类 + 字符
 字符 + string类

譬如如下代码: 

int main() {
    // 定义字符串和字符
    string str1 = "Hello";
    string str2 = "World";
    const char* cstr = " C++";
    char ch = '!';

    // 1. string类 + string类
    string result1 = str1 + str2;
    cout << "string + string: " << result1 << endl; // 输出 "HelloWorld"

    // 2. string类 + 字符串 (C风格字符串)
    string result2 = str1 + cstr;
    cout << "string + C-style string: " << result2 << endl; // 输出 "Hello C++"

    // 3. 字符串 + string类
    string result3 = cstr + str2; // C风格字符串 + string类
    cout << "C-style string + string: " << result3 << endl; // 输出 " C++World"

    // 4. string类 + 字符
    string result4 = str1 + ch;
    cout << "string + char: " << result4 << endl; // 输出 "Hello!"

    // 5. 字符 + string类
    string result5 = ch + str1; // char + string类
    cout << "char + string: " << result5 << endl; // 输出 "!Hello"

    return 0;
}

6.2输入输出操作符

我们的string中也重载了输入输出操作符。

	void test15()
	{
		string s;
		cin >> s;//输入
		cout << s<< endl;//输出
	}

我们可以通过这个操作来输入和输出函数。

但是,我们发现了一个问题,如果我们输入的字符串中有空格的话 则空格后的字符会进入缓冲区。

因此,我们便可以用到getline函数。


七.string中getline函数

在用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。

这时,我们就需要用getline函数完成一串含有空格的字符串的读取操作了。

getline()函数的原型如下:

istream& getline (istream& is, string& str);

getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。

int main()
{
	string s;
	getline(cin, s); //输入:hello k
	cout << s << endl; //输出:hello k
	return 0;
}

 同样的,getline也可以自定义分隔符delim终止。

这个版本的getline原型如下:

istream& getline (istream& is, string& str, char delim);

这个函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。 

int main()
{
	string s;
	getline(cin, s, 'D'); //输入:hello CSDN
	cout << s << endl; //输出:hello CS
	return 0;
}

 八.后记

string类的接口上是这篇博文:string接口上

有关string类的模拟实现可参考此片博文:string的模拟实现

如果你想更深入的了解string类函数的使用方法,可参考cpp官网:cpp官网

码字不易,给个点赞收藏叭~~~

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

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

相关文章

Anaconda +Pytorch安装教程

Anaconda Pytorch安装教程 Anaconda安装 小土堆的安装教程&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili Free Download | Anaconda 这里自己选一个文件夹安装即可 第一个红框表示添加图标到开始菜…

细说MCU用自带的波形发生器实现DAC输出的方法

目录 一、参考示例 二、配置参数 1.配置DAC 2.配置TIM3 三、代码修改 四、查看结果 DAC模块自带的硬件波形发生器只有三角波(Triangle wave)和 (Noise wave)两种。此外&#xff0c;如果配置了Trigger2参数&#xff0c;在波形发生模式中就出现(并且仅出现)锯齿波的选项(Sa…

Codeforces Round 874 (Div. 3)(A~D题)

A. Musical Puzzle 思路: 用最少的长度为2的字符串按一定规则拼出s。规则是&#xff1a;前一个字符串的尾与后一个字符串的首相同。统计s中长度为2的不同字符串数量。 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 20…

vue3前端开发-小兔鲜项目-登录功能的业务接口调用

vue3前端开发-小兔鲜项目-登录功能的业务接口调用!这次&#xff0c;正式调用远程服务器的登录接口了。大家要必须使用测试账号密码&#xff0c;才能验证我们的代码。 测试账号密码是&#xff1a;账号&#xff08;xiaotuxian001&#xff09;&#xff1b;密码是&#xff08;1234…

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn&#xff08;简称sklearn&#xff09;是一个非常流行的Python机器学习库&#xff0c;提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述&#xff1a; 1. 安装scikit-learn 首先&#xff0c;确保你已经安装了Python和…

什么是hdfs如何使用驱动程序访问hdfs

目录 什么是hdfs 主要特点包括&#xff1a; 架构组成&#xff1a; 应用场景&#xff1a; 如何使用驱动程序访问hdfs 准备工作环境&#xff1a; 启动 Hadoop 服务 可能遇到的问题&#xff1a; ssh验证失败 验证Hadoop服务 对hdfs进行文件操作 什么是hdfs HDFS&#x…

【数据结构】栈(基于数组、链表实现 + GIF图解 + 原码)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构 &#x1f4da;本系列文章为个人学…

Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)

目录 0.上篇文章 1.V1 版本 - echo server 1.1认识接口 1.2实现 V1 版本 - echo server&#xff08;细节&#xff09; 1.3添加的日志系统&#xff08;代码&#xff09; 1.4 解析网络地址 1.5 禁止拷贝逻辑&#xff08;基类&#xff09; 1.6 服务端逻辑 &#xff08;代码&…

Leetcode—769. 最多能完成排序的块【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—769. 最多能完成排序的块 实现代码 class Solution { public:int maxChunksToSorted(vector<int>& arr) {int ans 0;int mx INT_MIN;for(int i 0; i < arr.size(); i) {mx max(arr[i], mx);if(mx i) {a…

【C++】C++应用案例-旋转图像

旋转图像的需求&#xff0c;在图片处理的过程中非常常见。我们知道对于计算机而言&#xff0c;图像其实就是一组像素点的集合&#xff0c;所以图像旋转的问题&#xff0c;本质上就是一个二维数组的旋转问题。 我们可以给定一个二维数组&#xff0c;用来表示一个图像&#xff0c…

【C++】——红黑树(手撕红黑树,彻底弄懂红黑树)

目录 前言 一 红黑树简介 二 为什么需要红黑树 三 红黑树的特性 四 红黑树的操作 4.1 变色操作 4.2 旋转操作 4.3 插入操作 4.4 红黑树插入代码实现 4.5 红黑树的删除 五 红黑树迭代器实现 总结 前言 我们之前都学过ALV树&#xff0c;AVL树的本质就是一颗平…

Oracle对比两表数据的不一致

MINUS 基本语法如下 [SQL 语句 1] MINUS [SQL 语句 2];举个例子&#xff1a; select 1 from dual minus select 2 from dual--运行结果 1-------------------------------- select 2 from dual minus select 1 from dual--运行结果 2所以&#xff0c;如果想找所有不一致的&a…

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…

富芮坤FR800X系列之按键检测模块设计

FR800X系列按键检测模块 读者对象&#xff1a; 本文档主要适用以下工程师&#xff1a; 嵌入式系统工程师 单片机软件工程师 IOT固件工程师 BLE固件工程师 文章目录 1.概要2.用户如何设计按键检测模块2.1 GPIO初始化2.2按键模块初始化2.3设计中断函数&#xff1a;2.4循环…

【Python面试题收录】Python编程基础练习题①(数据类型+函数+文件操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题&#xff08;str&#xff09; 请编写一个Python程序&#xff0c;完成以下任务&#xff1a; 去除字符串开头和结尾的空格。使用逗号&#xff08;","&#…

【数据库】Quartz2.3 框架 数据库设计说明书

1、 Quartz表说明 2、 quartz 的触发时间的配置 1、 cron 方式&#xff1a;采用cronExpression表达式配置时间。 2、 simple 方式&#xff1a;和JavaTimer差不多&#xff0c;可以指定一个开始时间和结束时间外加一个循环时间。 3、 calendars 方式&#xff1a;可以和cron配合使…

Java-----栈

目录 1.栈&#xff08;Stack&#xff09; 1.1概念 1.2栈的使用 1.3栈的模拟实现 1.4栈的应用场景 1.5栈、虚拟机栈、栈帧有什么区别呢 1.栈&#xff08;Stack&#xff09; 1.1概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操…

Centos8 yum 更换源以及安装内核头文件

文章目录 一、简介二、yum 更换源三、安装内核头文件 一、简介 CentOS 是一个开源项目&#xff0c;发布了两个不同的 Linux 发行版——CentOS Stream 和 CentOS Linux 。 CentOS Stream 是即将发布的红帽企业 Linux 产品的上游开发平台。 CentOS 项目将于 2024 年 6 月 30 日…

场外期权如何报价?名义本金是什么?

今天带你了解场外期权如何报价&#xff1f;名义本金是什么&#xff1f;投资者首先需要挑选自己想要进行期权交易的沪深上市公司股票。选出股票后&#xff0c;需要将股票信息、预期的操作时间&#xff08;如期限&#xff09;、看涨或看跌的选择以及预计的交易金额等信息报给场外…

商家虚假发货行为频发,电商平台如何通过物流轨迹来监管?(内附视频号、抖音、京东的发货规则)

近年来&#xff0c;“虚假发货”问题在电商行业中日益凸显。某投诉平台数据显示&#xff0c;截至2024年7月&#xff0c;搜索“虚假发货”显示的投诉高达19万条&#xff0c;如何有效监控卖家发货的合规性与及时性、打击虚假发货行为成为电商平台的重要议题。 为了维护消费者权益…