STL
STL是什么
什么是STL?STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL的六大组件
要学一个新知识,知道这个知识从大方向看有什么内容是必须的
六大组件主要如下所示
STL是C++的重要组成部分,如果把前面数据结构模拟实现的过程看成造轮子,那STL就是用前人创造好的轮子进行更高效率的工作
站在前人的肩膀上快速开发
那下面就开始学习string,学习新知识要有阅读文档的能力,有阅读文档的能力是必要的,本文及以后采用的是cplusplus的网站进行文本阅读和知识学习
string
上面是截取自该网站的内容信息,首先从中我们可以获取的信息有,string其实是typedef来的,是由basic_string来的,其次,标准string类通过类似于标准字节容器的接口提供了对此类对象的支持,但添加了专门设计用于操作单字节字符串的特性,前面也将到,string类是提供顺序字符的对象
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
- 不能操作多字节或者变长字符的序列
那既然string是一个类,那么就必然有类内的成员函数:
string类内成员函数
string类对象中,成员函数相当多,这里先写一些比较常用的
首先是构造函数:
下面是对构造函数的用法:
#include <iostream> #include <string> using namespace std; int main() { char arr[] = { "hello world" }; string s1; // 构造空的string对象 string s2(arr); // 用cstring构造string类对象 string s3(10, 'a'); // 构造包含10个a的string类对象 string s4(s2); // 拷贝构造 cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4 << endl; cout << endl; return 0; }
其次是赋值重载
这是C++98的标准
在C++98的基础上,C++11又做出了新的改变,增加了新的赋值方式,但整体上还是利用C++98较多一些
访问元素的方式
从这里可以看出,运算符重载功能的强大,极大的增加了代码的可读性,以下面的例子来看:
int main() { string s1 = "hello world"; for (int i = 0; i < s1.size(); i++) { cout << s1[i] << " "; } cout << endl; }
这里表面上看是和C语言中对字符串的遍历一样,事实上并不一样,这里使用的是运算符重载,增加了代码的可读性
下面是和容量相关的操作:
增删查改:
string方便的地方也体现在增删查改上,上面的函数都可以实现对string内内容的增删查改
迭代器
迭代器是STL中的重要组成部分,在几乎所有容器中,迭代器的用法相似,这里对迭代器进行重点介绍,其他容器的用法和这里是大差不差的
首先要看到迭代器是什么?迭代器的作用是什么?
如果从功能来看,迭代器可以理解成指针,利用指针来对string类内存储的数据进行多项操作,迭代器的作用可以对string类内成员进行成员访问,从而进行读和写等其他操作均有
这里首先看begin和end
int main() { string s1 = "hello world"; string::iterator it = s1.begin(); while (it != s1.end()) { cout << *it << " "; it++; } cout << endl; }
上面是迭代器的用法,再看C语言中我们想要访问一个字符串是如何遍历的?
int main() { char s1[] = { "hello world" }; char* ptr = s1; while (*ptr) { cout << *ptr << " "; ptr++; } cout << endl; }
从中也可以看出实际上,迭代器从功能来讲就是指针
这里需要注意迭代器的定义是如何定义的
对于不同的迭代器,定义的时候定义方法是不一样的
下面来看rbegin和rend,和前面不同,里面多了一个r,这个r的意思,实际上就是reverse,意思是反转,因此rbegin的意思就是反转着去读取数据
int main() { string s1 = "hello world"; string::iterator it = s1.begin(); string::reverse_iterator rit = s1.rbegin(); while (rit != s1.rend()) { cout << *rit << " "; rit++; } cout << endl; while (it != s1.end()) { cout << *it << " "; it++; } cout << endl; }