C++STL系列之概述
前言
这部分其实早就学完了,抽出来时间准备复习一下STL,C++中STL的重要性不言而喻,是C++中的一个重要组成部分,本次内容是对其的一个概述,之后会具体讲解。
一、什么是STL
STL – 标准模板库(standard template library),涵盖了数据结构和算法,充分体现了C++是一门面向对象的语言,以前在C语言需要自己造轮子,现在使用STL可以更加简单,也隐藏了内部的实现。STL的版本较多,当前主流的版本比如libstdc++,MSVC STL等等,目前Linux系统下使用最为广泛的版本是libstdc++,该版本以 SGI STL 为基础发展而来,参考源代码可以参考这个版本。
二、六大组件
比较重要的有三个:算法 迭代器 容器
其余三个:仿函数,空间配置器,适配器。
具体是什么,这里会进行简单的讲解,后面进一步的学习会更加深刻。
1.容器
字面意思,容纳元素的器件,比如vector,string,list,map,set等都是容器,容器大体可分为两类:1.序列式容器,此类容器内部的存储顺序一般是按插入顺序来的,没有规则,比如vector,string,list。2. 关联式容器,此类容器按照一定的规则排序,比如map,set按key来排序。
2.算法
字面意思,包含在头文件< algorithm >中提供了多种多方面的函数,排序,去重,挑选,查找,最大最小,堆操作等等,注意使用条件,比如sort内部要传随机迭代器,因为底层是快排,需要作+ 或者 - 。
3.!!!!!迭代器!!!!!
最重要的一个部分,迭代器是容器和算法之间的桥梁,它的作用类似于指针,能够让我们不依赖于具体容器类型去遍历容器中的元素。迭代器为各种容器提供了统一的访问接口,极大地增强了代码的通用性和灵活性。
容器中的迭代器一般支持三种操作:
1.解引用,*it拿到当前元素的值(->)
2.递增,++走到下一个迭代器的位置
3.比较 通过是否到end()来判断是否遍历完容器
大致分为六类:
这个表格是非常完美的表格,充分体现了这五种迭代器的关系(第六类后面提)
容器里面的迭代器一般只需要记住三类,Forward iterator 和 Bidirectional iterator和 Random iterator。他们都继承了input和output迭代器,所以如果这个算法需要input迭代器,子类也可以使用(继承的知识点),这三个的区别其实看图可以看个大概,最重要的:
1.单向 双向 和 随机 单向支持++,双向支持++和- -,随机支持++ - - + -
单向:比如单链表forward_list,哈希表unordered系列
双向:list set map
随机:vector deque
具体介绍每一个容器的模拟会使用迭代器,也会加强理解。
第六类是C++20提出的Contiguous Iterator,连续迭代器,就是随机迭代器的基础上还要求内存上是连续的,比如vector。
最重要的还是单向双向和随机要理解好。
遍历容器的基本方式:其中Container表示具体容器名字。
auto it = Container.begin();
while (it != Container.end())
{cout << *it << endl;++it;
}
4.空间配置器
就是一个内存池,给你提供空间,一直在用,但是不知道在用
比如vector< int > v(10,0); 就new了十个空间,内存池为你提供了空间,不用过多了解,也接触不到底层。
5.仿函数
像函数一样的类,具体在优先级队列会进行具体的讲解,虽然lambda的出现用的也很香。先记住写法,后面讲使用
//比如调用函数 func(1),仿函数就是看着像函数实际是类,需要重载operator()
struct Less{bool operator()(int a,int b){return a < b;}
};
6.适配器
适配器可以理解为对现有资源的复用,比如C手搓stack和queue的时候,可以使用链表结构或者顺序表结构,C++中的实现就可以复用vector和list和deque(库里默认是deque,后面讲),所以stack和queue不是容器!!!!
三、缺陷
STL还是存在的一定的缺陷的,1.冗余问题,array,string的size 和 length,单链表等等。2.STL没有支持线程安全!现在也没有,这是个很大的问题,需要手动上锁。
总结
之后会进行容器string等等一系列的讲解,对于底层会额外出数据结构的讲解,(本假期应该是搜索树系列),正好开学要学数据结构,那些C手搓的就上课再去更新。