课程网站建设特色,石家庄旅游景点,wordpress 前台注册,南京网站排名提升C标准库-体系结构与内核分析
根据源代码来分析
介绍
自学C侯捷老师的STL源码剖析的个人笔记#xff0c;方便以后进行学习#xff0c;查询。 为什么要学STL#xff1f;按侯捷老师的话来说就是#xff1a;使用一个东西#xff0c;却不明白它的道理#xff0c;不高明标准库-体系结构与内核分析
根据源代码来分析
介绍
自学C侯捷老师的STL源码剖析的个人笔记方便以后进行学习查询。 为什么要学STL按侯捷老师的话来说就是使用一个东西却不明白它的道理不高明 Level 0 使用C标准库
标准库和STL是同样的东西吗
不是在标准库当中百分之80左右是STLSTL分为六大部件。 一些新旧标准
C标准库没有.h的后缀了例如#include vector新式的头文件不带.h例如#include cstdio但是原来的带有.h的依然可以使用命名空间把什么函数模板之类的可以封装起来新式的头文件以及组件都被封装到std当中
STL六大部件
容器分配器算法迭代器适配器分配器
容器容器要放东西东西要占用内存所以容器他非常好的是可以帮我们把内存的问题给解决掉你看不到内存这个东西只需要不断从容器当中放入/取出东西就好了所以容器的背后需要另外一个部件去支持它这个部件就是分配器数据在容器里面。分配器是用来支持容器的。算法有一些函数/操作是由容器做的但是更多的是包含在算法当中操作数据的操作在算法里面。迭代器如何用算法去操作数据呢使用迭代器也就是泛化指针。仿函数作用像是一种函数。适配器把容器/算法/迭代器做一些转换。 六大部件之间的关系 vectorint, allocatorint第二个参数是allocator。 以上为六大部件之间具体的联系与配合。在上方的程序当中lessint()这是标准库当中的一个仿函数然后他的作用是进行比较比如说a b然后现在利用了count_if这个算法其作用是找到我们指定目标的数值现在假如需要找到小于40的值但是仿函数少了第二参数所以就可以利用之前适配器的功能适配器就是把容器/算法/迭代器做出一些转换使用bind2nd这个转换即可有了第二参数40之后又进行函数的转换加了一个not1以前要找小于等于40现在要大于40。
#includevector
#includealgorithm
#includefunctional
#includeiostreamusing namespace std;int main(void) {int ia[ 6 ] { 27, 210, 12, 47, 109, 83};vectorint, allocatorint vi(ia, ia6);cout count_if(vi.begin(), vi.end(), not1(bind2nd(lessint(), 40)));return 0;
}结果
4...Program finished with exit code 0
Press ENTER to exit console.疑惑
仿函数less()这是标准库当中的一个仿函数然后他的作用是进行比较比如说a b适配器
复杂度 前闭后开的区间
把元素放到容器当中容器当然是有头有尾的所有容器都提供begin()end()迭代器头没有疑虑尾巴呢所谓容器的前闭后开区间标准库规定begin()要表示开始的启动end()表示最后一个元素的下一个元素。 ###容器的遍历C11之前的写法
ContainerT c;
...
ContainerT::iterator ite c.begin();
for (; ite ! c.end(); ite)...最新的写法最推荐C11基于范围的for循环
for (auto decl : coll)
{statement;
}
decl是一个声明coll是一个容器相比以前的写法方便太多了。
不是非必要的时候不用auto因为知道一个元素的类型还是很重要的。 容器的结构 容器的分类
1.序列式容器 序列式容器特点额外学习材料array一段连续空间不论是否使用都会全部占用arrayvector尾部可进可出当空间不够时会自动扩充vectordeque双向都可扩充两端都可进可出dequelist一个双向环状链表有向前后和向后两个指针listforward_list一个单向链表仅有向后一个指针forward_list
关联型容器
联式容器类似于key-value非常适合于查找操作 关联式容器名特点实现注释额外学习材料set/multisetkey和value是同一个BST存储是有序的红黑树加上multi意味着可以重复键值对setmultisetmap/multimap每一个key对应一个valueBST存储是有序的红黑树加上multi意味着可以重复键值对mapmultimapunordered_set/unordered_multiset相对于set/multiset存储是无序的哈希表加上multi意味着可以重复键值对unordered_setunordered_multisetunordered_map/unordered_multimap相对于map/multimap存储是无序的哈希表加上multi意味着可以重复键值对unordered_mapunordered_multimap在标准库当中并没有规定set和map用什么来实现但是用红黑树因为左右两边会自己平衡非常好所以各家IDE都用红黑树来做set和map。
map每一个节点都有key和valueset却没有明确划分。
选择普通的set和map里面的元素的key是不能重复的但是使用multiset以及multimap的时候里面的key是可以重复的。
哈希表的某一条链表不能太长因为单链表是要不断进行遍历的这样时间复杂度就会很高。