STL容器之string(上)

2023-12-17 23:41:27

目录

什么是STL

string类

string类常见接口

string类的常见构造函数

?string类对象的容器操作

?string类对象的访问及遍历操作

string类对象的修改操作

拓展


从本期开始,我们将正式学习C++中的STL,美国的麦克阿瑟将军说过:“C++不能没有STL就像西方不能没有耶路撒冷”。这足以见得STL在C++中的地位。

什么是STL

STL:STL俗称标准模板库,是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构算法软件框架

为什么说STL是一个保罗数据结构与算法的软件框架呢?我们通过STL的六大组件不难看出,STL六大组件为:仿函数,算法,迭代器,空间配置器,容器,配接器。图示如下:

算法有很多,比如查找,交换,逆置,排序,归并等等,容器就是我们常说的数据结构,这些数据结构是在库中定义过的,我们可以直接使用。

本期我们主要学习的就是STL容器中的string类。在学习stl时我们使用https://legacy.cplusplus.com/进行相关学习,小伙伴可以自行在这个官网查看对应的使用方法。

string类

在学习C语言时,我们通常使用字符数组来定义字符串,但是在C++中做了改进,我们用string类来定义字符串。

string类常见接口

string类的常见构造函数

1.无参的构造函数,即默认构造函数,构建一个空字符串。

2.拷贝构造函数。

3.?用一个常量字符串来初始化对象的构造函数。

代码如下:?

#include<iostream>
using namespace std;
#include<string>
int main()
{
	string s1;
	string s2("hello yjd\n");
	string s3(s2);

	return 0;
}

截图如下:?

?string类对象的容器操作

1.返回字符串的有效字符的个数,有效字符就是'\0'之前的所有字符。

代码如下:?

int main()
{
	string s1("hello yjd");
	cout << s1.length() << endl;
	cout << s1.size() << endl;
	return 0;
}

截图如下:?

2.返回空间总大小,即字符串最多容纳的字符的个数。

代码如下:?

int main()
{
	string s1("hello yjd");
	cout << s1.capacity() << endl;
	return 0;
}

截图如下:?

?3.清除字符串中的有效字符。

代码如下:?

int main()
{
	string s1("hello yjd");
	cout << s1 << endl;
	s1.clear();
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	return 0;
}

?截图如下:

注意:清除有效字符并不影响字符串的capacity的大小,即不影响字符串字符串存储字符的最大个数。

4.判断字符串是否为空,为空返回ture,否则返回false。

代码如下:

int main()
{
	string s1("hello yjd");
	string s2;
	cout << s1.empty() << endl;
	cout << s2.empty()<< endl;
	return 0;
}

?截图如下:

?string类对象的访问及遍历操作

1.重载[ ],在之前[ ]只允许用于整形数组的元素的访问,但是在重载之后,支持自定义对象进行元素的访问,string类对象可以看成是一个字符数组。

2.at成员函数进行访问。

??代码如下:

int main()
{
	string s1("hello yjd");
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1.at(i) << " ";
	}
	return 0;
}

截图如下:?

如果我们执行完下面的代码,会打印什么呢?

int main()
{
		string s1("hello yjd");
		for (size_t i = 0; i < s1.size(); i++)
		{
		        s1[i]+=1 ;
		}
		cout << s1 << endl;
		for (size_t i = 0; i < s1.size(); i++)
		{
			s1.at(i) += 1;
		}
		cout << s1;
		return 0;
}

我们发现对象的值发生了改变,这样就意味着[ ]运算符重载和at成员函数的返回值应该是字符串中每个字符的引用,所以此时引用最大的作用并不是为了减少拷贝,而是为了改变对象的值。?

string类对象的修改操作

1.push_back,在字符串尾部添加字符

代码如下:?

int main()
{
	string s1("hello yjd");
	cout << s1 << endl;
	s1.push_back('h');
	cout << s1 << endl;
}

?截图如下:

?2.append,在字符串后追加字符串。

代码如下:

int main()
{
	string s1("hello yjd");
	cout << s1 << endl;
	s1.append("hello djy");
	cout << s1 << endl;
}

截图如下:

3. 重载+=,使得自定义字符串对象可以实现+=操作。

代码如下:

int main()
{
	string s1("hello yjd");
	cout << s1 << endl;
	s1 += 'h';
	cout <<s1 << endl;
	s1 += "hello djy";
	cout << s1 << endl;
}

截图如下:

?上面便是我们经常使用到的string类的成员函数。

拓展

1.不知道大家有没有注意到下述行代码:

cout << s1 << endl;

我们知道流插入运算符一般情况下只能用于编译器的内置类型,可是这里为什么却可以使用在自定义类型之上呢?

这是因为我们对流插入运算符和留提取运算符都做了重载,作为了string类的非成员函数,所以我们可以使用流插入运算符实现对自定义对象的输出。

?2.我们知道stl的容器都是建立在模板的基础上进行学习的,可是为什么我们在定义string类对象时丝毫没有看到模板的影子呢?就比如这行代码:

string s1("hello yjd");

?其实,cplusplus中的文档已经告诉了我们答案:

原来string是对basic_string<char>的重命名。这就更奇怪了,一个字符串的每个元素的类型可能性就是字符呀,还能有其他类型吗?

其实,这就牵扯到了编码的相关概念,因为对于英语的字符而言,无非就是26个英文的大小加上一些其它的字符,一个char是一个字节,也就是8个bit,转为10进制就是256,所以使用一个char类型可以表示256个字符,对于英语的字符这肯定是够了的。但是对于中文,各种菠萝文,这些语言那么多字符,肯定是远远不够的,所以此时字符串的每个元素的类型可能就是其它的char,在cpluspus文档中可以看到:

总共有四种类型的char,所以string类也是模板,本质上就是basic_string类模板。

好了,以上便是本期的所有内容,主要讲述了string类的一些基本的操作,都是一些基础的内容。

本期内容到此结束^_^

文章来源:https://blog.csdn.net/qq_55958734/article/details/135049466
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。