✨个人主页:熬夜学编程的小林
💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】
目录
讲解string之前需要先讲解STL,因为string类属于STL的一部分。
注意:学习STL看文档非常重要,建议使用cplusplus网站,博主后续使用的网站也是cplusplus。
1、什么是STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分 ,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL是C++标准库的一个子集。
2、STL的版本
原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。
P. J. 版本
由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
RW版本
由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。SGI版本由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。
3、STL的六大组件
容器(Containers): 各种数据结构,如 vector、list、deque、set、map 等。从实现的角度来看,容器是一种类模板。
算法(Algorithms): 各种常用算法,提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作,比如 sort、search、copy、erase。从实现的角度来看,STL 算法是一种函数模板。
迭代器(Iterators): 迭代器用于遍历对象集合的元素,扮演容器与算法之间的胶合剂,是所谓的"泛型指针",共有 5 种类型,以及其他衍生变化。从实现角度来看,迭代器是一种将 operator*、operator->、operator++、operator-- 等指针操作予以重载的类模板。所有的 STL 容器附带有自己专属的迭代器,因为只有容器设计者才知道如何遍历自己的元素。
仿函数(Functors): 也称为函数对象(Function object),行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的 类 或者 类模板 。
适配器(Adaptors): 一种用来修饰容器或者仿函数或迭代器接口的东西。例如 STL 提供的 queue 和 stack,就是一种空间配接器,因为它们的底部完全借助于 deque。
**分配器(Allocators):**也称为空间配置器,负责空间的配置与管理。从实现的角度来看,配置器是一个实现了动态配置空间、空间管理、空间释放的类模板。
暂时对于STL的六大组件了解即可。
4、STL的重要性
- 在笔试中
- 在面试中
3. 在工作中
网上有句话说:"不懂STL,不要说你会C++"。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。
5、如何学习STL
简单总结一下:学习STL的三个境界:能用,明理,能扩展 。
6、STL的缺陷
STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。
STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。
7、为什么学习string类
7.1、C语言中的字符串
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想(核心封装继承多态),而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
7.2、两个面试题
1、
把字符串转化为正数https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/description/2、
字符串相加https://leetcode.cn/problems/add-strings/description/
在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。
8、标准库中的string类
8.1、string类
字符串cplusplus文档介绍https://cplusplus.com/reference/string/string/?kw=string
字符串是表示字符序列的类 。
标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口 ,但添加了专门用于操作单字节字符字符串的设计特性。
string类是使用char类型 (即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string))。
string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
string是表示字符串的字符串类。
该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string。
不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std。
8.2、在文档中查找string相关知识
重要的事情说三遍,学习C++的容器必须有查阅文档习惯,即开头说的cplusplus网站,也可以使用en.cppreference网站,两个网站都可以,博主推荐前面一个,因为访问速度更快。
那么知道使用哪个网站查文档之后,实际我们怎么操作呢?以下通过图片加文字进行讲解。
1、进入cplusplus网站
在浏览器搜索网址,看到这个界面说明第一步没有问题,成功进入了网站。
2、方式一:
找需要查找的容器或者库函数,有两种方式,第一种通过搜索,但是新版本不支持搜索功能,因此需要进入旧版网站,点击上图中右上角的Legacy version,即可进入旧版网站。界面如下图:
需要查找什么内容,直接搜索即可。
方式二:
点击第一张图片左上角的Reference(参考),进入即可看到Standard C++ Library reference(C++标准参考库),其中有C语言库,容器等知识。
需要什么内容依次往下翻,看是否是自己想要的内容。string在Miscellaneous headers中(最下面)。
搜索看到的界面如下图:
总结
本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!