目录
什么是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类的一些基本的操作,都是一些基础的内容。
本期内容到此结束^_^