自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

啦啦啦

取法其上,得乎其中,取法其中,得乎其下,取法其下,法不得也

  • 博客(44)
  • 收藏
  • 关注

原创 STL源码分析目录

SIG STL源码分析前言本专栏主要以STL源码剖析分析路线来分析SIGSTL3.0源码.整个模块准备对学习STL源码剖析之后做一个系统的总结, 这些都是我个人的理解, 如果分析有什么问题欢迎各位大佬们指出. 也很感谢作者以及网络中各个大佬的总结, 让我也能更容易更深刻的理解到STL强大和方便, 也让我对template感受深刻.以下是我自己对STL版块进行分析.总共分为六个版块 : 空...

2018-12-11 20:24:43 3372

原创 const浅析

前言c++中使用到const的地方有很多, 而且const 本身也针对不同的类型可能有不同的含义, 比如对指针就有顶层和底层. 本节就是探讨关于C++中const的在不同的地方不同表现或含义.const关于const :const修饰的对象一旦创建一般就不能改变, 所以对于const对象必须进行初始化.int i = 0;const int j; // error. 必须进行初始...

2018-12-13 13:59:57 1116

原创 template之类相关

前言前面两节主要分析了使用template的注意点以及非类型参数如何使用, 本节来探讨虚模板函数和模板拷贝构造函数.虚函数模板在我们使用模板从来都没有将虚函数与模板进行套用, 那么这两者能不能同时连用呢?这个直接来写代码验证才知道.class point{ public: template<class T> virtual T getX() { r...

2018-12-11 19:46:27 1042

原创 template之非类型模板参数

前言前一节分析了关于template的使用注意, 本节分析关于template非类型参数的使用, 非类型参数可能在有些人认为并没有太大作用, 但是既然C++规定有能这样使用就肯定有其意义, 这里就做一个浅析.非类型模板参数非类型参数, 可用在模板中自定义为整型类型, 指针或引用, 不能定义为浮点数等其他类型.非类型模板参数在编译期间就已经实例化, 所以其模板实参必须是常量表达式.temp...

2018-12-11 19:45:14 3753

原创 template之模板注意事项

前言在分析STL之前, 我们需要先对template做一个回忆, 可能我总结的内容你都会了, 也可能你没有了印象了, 但是我还是希望你先浏览一下template的用法. 毕竟STL全部都涉及到了模板, 而template是学习STL的基础.template使用template的使用大大提高了代码的复用性, 抽象性.类模板实例化时并不是每个成员函数都实例化了, 而是使用到了哪个成员函数, ...

2018-12-11 19:42:40 2066 1

原创 STL源码分析之配接器

前言本节分析STL组件之一的配接器, 配接器就像转接口一样, 将一个对class封装变成了另外一个功能的class, 这在前面分析容器的时候遇到过, 比如: map, set等, 都是修改底层接口形成另外一个功能的class.配接器可以应用于 : 仿函数, 迭代器, 容器.关于配接器应用于容器前面都分析过了, 接下来就分析部分应用于仿函数和迭代器的配接器吧.应用于迭代器STL实现了很多应...

2018-12-10 00:03:38 496

原创 STL源码之仿函数

前言本节将分析STL六部分之一的仿函数, 在前面分析容器以及算法的时候都有使用过仿函数, 在算法中我们还自定义过仿函数(函数对象), 就是使用struct或者class重载运算符, 就是行为类似于函数的对象.根据仿函数的操作数可分为 : 一元和二元仿函数.根据功能可分为 : 算术运算, 关系运算, 逻辑运算.仿函数与函数指针STL采用对象重载操作实现函数行为并没有直接定义函数...

2018-12-10 00:02:20 673

原创 STL源码分析之二分查找算法

前言前面我们分析了关于stl_algo.h中的基本算法, 本节也将继续分析该文件中的算法实现, 即二分查找.stl_algo.h提供了lower_bound和upper_bound两种查找, 前者是找出第一个满足条件的迭代器, 后者则是找出最后一个满足条件的迭代器, 两者结合就能知道该容器中重复的个数.二分查找分析lower_boundForwardIterator版本// 版本一...

2018-12-09 23:57:35 543

原创 STL源码分析之stl_algo.h中的基本算法

前言上一节分析了stl_algo.h中的rotate函数实现, 本节我们继续分析该文件的中的其他基本算法, 这些算法功能实现看似很简单, 但是这些算法都能进行衍生, 用户自定义, 简单化了我们的部分编程, 直接使用无需再定义.基本算法for_each将[first, last) 范围的元素由传入仿函数(函数)进行处理, 最后返回仿函数(函数).template <class Inp...

2018-12-08 15:17:11 833

原创 STL源码分析之数值算法

前言本节所分析的算法是在stl_numeric.h中, 本节以源码 + 例子的形式一起分析这些实现的操作.数值算法分析accumulate要求传入两个InputIterator类型的迭代器和一个初始化值, 第二个版本还支持在传入一个仿函数或函数.// 版本一template <class InputIterator, class T>T accumulate(InputI...

2018-12-08 15:14:34 428

原创 STL源码分析之rotate算法

前言stl_algo.h文件中有很多的算法实现, 在这里STL分析中挑选几个函数进行分析, 其他的算法大家有兴趣可以自己看看, 本节分析stl_algo.h文件中的rotate算法. 该算法实现的功能是将[first, middle), [middle, last)两段区间的元素进行交换.rotate分析template <class ForwardIterator>inlin...

2018-12-08 15:11:11 623

原创 STL源码分析之copy算法

前言在前面分析顺序容器和关联容器时, 总会遇到copy这个函数, 当时并没有去分析这个函数, 毕竟都能知道他是什么功能, 本节就来揭开它面纱.copy分析copy函数源码在stl_algobase.h中, 该结构中还有很多其他的算法实现, 我只是从中挑选出了copy, 有兴趣可以自己看看里面的其他算法.copy同traits编程, 都对性能做了最优的优化, 能使用的memmove函数就使用...

2018-12-08 15:09:33 823

原创 STL源码分析之hash_multimap配接器

前言上节分析了hash_map知道它是不允许存在相同的键存在, 本节的hash_multimap就可以允许存在多个相同的键, 以hashtable为接口, 这里我就只分析与hash_map的不同点吧, 毕竟很多都是一样的了, 没有必要重复的分析相同的代码.insert最大的区别就在这里, hash_multimap 是以insert_equal为接口, 所以支持插入重复的键.#ifndef...

2018-12-08 15:08:07 461

原创 STL源码分析之hash_map配接器

前言hash_map是以hashtable为底层的配接器, 他与map的功能基本一样, 只是map是有序的将键值插入, 而hash_map则是无序的插入键值, 本节也简单对它做一个分析.hash_map分析类型定义#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Key, class T, class HashFcn = ...

2018-12-08 15:05:41 460

原创 STL源码分析之hash_multiset配接器

前言上节分析了hash_set, 他与set有很多的相似之处, 键不能重复, 不能修改等, 本节分析的hash_multiset与multiset又有很多相似之处, 键值可以重复.hash_multiset分析同样也是以hashtable为底层的配接器.定义数据类型#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Val...

2018-12-08 15:03:51 426

原创 STL源码分析之hash_set配接器

前言前面我们分析了hashtable, 后面的几节我们来分析其衍生出来的配接器, 本节分析的hash_set, 他与set最大的不同在与前者的元素是无序排列的, 后者是有序排列hash_set操作int main(){ __gnu_cxx::hash_set<const char *> h_set(1); h_set.insert("one"); h_set.insert...

2018-12-08 15:02:24 462

原创 STL源码分析之hashtable关联容器 下

前言上节分析了hashtable的迭代器, 其构造函数, 基本函数, 本节我们分析hashtable的插入, 删除等操作.hashtable分析重载template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc>class hashtable { ....

2018-12-08 15:00:56 442

原创 STL源码分析之hashtable关联容器 上

前言前面我们分析过RB-tree关联容器, RB-tree在插入(可重复和不可重复), 删除等操作时间复杂度都是O(nlngn), 以及满足5个规则, 以及以他为底层的配接器; 本节就来分析hashtable另个关联容器, 他在插入, 删除等操作都可以做到O(1)的时间复杂度.哈希表概念哈希方法直接定址法:取关键字或关键字的某个线性函数值为散列地址。(这种散列函数叫做自身函数)数字分析...

2018-12-08 14:59:23 493 4

原创 STL源码分析之multimap配接器

前言前面我们分析了map, 知道map是不允许插入相同的键值的, 也不会保存第二次的数据, 而本节分析的multimap与map不同, 它允许多个重复的键值插入.mutimap操作int main(){ multimap<string, int> multi; // 这里重复插入了两个相同的键值 multi.insert(make_pair("one", 2));...

2018-12-06 20:16:45 401

原创 STL源码分析之multiset配接器

前言前面也分析过set, 并且set不能插入相同的键, 本节分析的multiset与set不同之处就是他允许插入相同的键.multiset操作int main(){ multiset<string> multi; // 允许重复插入键 multi.insert("zero"); multi.insert("zero"); multi.insert("one");...

2018-12-06 20:05:05 480 1

原创 STL源码分析之map配接器

前言上一节分析了pair结构, 正是为map分析做铺垫, map本身实现也不难, 其数据存储是pair, 存储结构是RB-tree, 即map也并不能说是关联容器, 而应该是配接器.map操作map的insert必须是以pair为存储结构, 当然也可以直接使用make_pair构造一个临时pair, 这个函数我们上节分析pair的时候讲过.int main(){ map<stri...

2018-12-06 19:08:51 393

原创 STL源码分析之pair结构体

前言前面在分析set, RB-tree都有在insert实现中出现pair, 下节分析map的时候更会经常出现pair, 所以打算在之前先对pair有个认识.pair是一个有两个变量的结构体, 即谁都可以直接调用它的变量, 毕竟struct默认权限都是public, 将两个变量用pair绑定在一起, 这就为map<T1, T2>提供的存储的基础.pair操作pair结构是在ma...

2018-12-06 19:07:12 930

原创 STL源码分析之set配接器

前言上面两节我们分析了RB-tree, 同时我们也知道了rb-tree的插入操作还分为可重复插入和不可重复插入(insert_unique). 本节分析set, 严格意义说set就是修改了底层容器接口的, 所以应该是配置器. set就是将RB-tree作为底层容器, 以insert_unique为核心的配接器.set操作下面是对set的构造和insert的简单操作, 这里重复插入one, 但...

2018-12-06 19:05:18 425

原创 STL源码分析RB-tree关联容器 下

前言上节我们分析了关于RB-tree的迭代器实现, 其中最重要的功能都会在rb-tree结构中调用. 本节我们就来分析RB-tree结构.再来复习一下红黑树的规则:每个节点的颜色是黑色或者红色根节点必须是黑色的每个叶节点(NULL)必须是黑色的如果节点是红色的, 则子节点必须是黑色的从节点到每个子孙节点的路径包括的黑色节点数目相同// 红黑定义typedef bool __r...

2018-12-06 18:55:17 443

原创 STL源码分析之RB-tree关联容器 上

前言本节将分析STL中难度很高的RB-tree, 如果对红黑树有所认识的那么分析起来的难度也就不是很大, 对红黑树没有太多了解的直接来分析的难度就非常的大了, 可以对红黑树有个了解红黑树之原理和算法详细介绍. 红黑树是很类似与AVL-tree的, 但是因为AVL-tree在插入,删除的操作做的实际操作很多, 综合而言计算机对内存的管理都采用平衡性相对AVL-tree较差一点的红黑树.RB-tr...

2018-12-06 18:52:59 786

原创 STL源码分析之slist有序容器 下

前言上节我们对slist的基本构成, 构造析构做了分析, 本节 我们就来分析关于slist的基本元素操作.slist分析基本属性信息slist是只有正向迭代, 所以只能直接获取头部的数据.template <class T, class Alloc = alloc>class slist{ ...private: slist& operator= (con...

2018-12-06 18:50:23 424

原创 STL源码分析之slist有序容器 上

前言不同于list是Forward Iterator类型的双向链表, slist是单向链表, 也是Bidirectional Iterator类型. slist主要耗费的空间小, 操作一些特定的操作更加的快, 同样类似与slist, 在执行插入和删除操作迭代器都不会像vector使迭代器失效. slist主要的问题在于它是单向的, 正向迭代器, 只有push_front, 没有push_back...

2018-12-05 22:51:49 463

原创 STL源码分析之priority_queue优先级队列

前言上一节分析heap其实就是为priority_queue做准备. priority_queue是一个优先级队列, 是带权值的. 支持插入和删除操作, 其只能从尾部插入,头部删除, 并且其顺序也并非是根据加入的顺序排列的. priority_queue因为也是队列的一种体现, 所以也就跟队列一样不能直接的遍历数组, 也就没有迭代器. priority_queue本身也不算是一个容器, 它是以v...

2018-12-05 22:44:38 783

原创 STL源码分析之heap大根堆

前言在分析本节之前你至少应该对堆排序有所了解, 大根堆, 小根堆等. 本节分析的heap就是堆排序, 严格意义上来讲heap并不是一个容器, 所以他没有实现自己的迭代器, 也就没有遍历操作, 它只是一种算法. 代码来自stl_heap.h.heap分析push插入元素插入函数是push_heap. heap只接受RandomAccessIterator类型的迭代器.注意, 在分析heap...

2018-12-05 22:39:24 771

原创 STL源码分析之queue配接器

前言上一节分析了stack实现, stack是修改了deque的接口而实现的一个功能简单的结构, 本节分析的queue也是用deque为底层容器封装.queue数据都是在头部进行操作的, 之允许进行push和pop操作.queue分析queue结构#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class T, class Seq...

2018-12-05 13:03:23 617

原创 STL源码分析之stack配接器

前言上面几节我们分析了deque是一个双向开口, 并且每部分数据也是存放在连续空间中, 而stack是栈, 只允许在尾进行操作, 而且stack的功能deque都已经实现了, 只需要对deque的功能进行部分封装就行了, 也就提取出pop_back, push_back就行了.stack严格他并不是容器, 它是一底部容器完成其所有的工作, 它只修改了容器的接口, 准确是叫配接器.stack源...

2018-12-05 13:01:15 362

原创 STL源码分析之deque有序容器 下

前言前面两节对deque基本所有的操作都分析了, 本节就分析deque的insert操作的实现. insert的重载函数有很多, 所以没有在上节一起分析, 本节也只是对部分重载函数进行分析, 剩下的列出源码就行了.源码分析insert实现这里先将insert的所有重载函数进行罗列.iterator insert(iterator position, const value_type&am...

2018-12-05 12:59:13 468

原创 STL源码分析之deque有序容器 中

前言前一节我们分析了deque的基本使用, 本节我们来分析一下deque的对map的操作, 即插入, 删除等. 但是本节只分析push, pop和删除操作, 而insert操作有点复杂还是放到下节来分析.push, pop因为deque的是能够双向操作, 所以其push和pop操作都类似于list都可以直接有对应的操作. 需要注意的是list是链表, 并不会涉及到界线的判断, 而deque是...

2018-12-05 12:57:14 529

原创 STL源码分析之deque有序容器 上

前言deque的功能很强大, 其复杂度也比list, vector复杂很多. deque是一个random_access_iterator_tag类型. 前面分析过vector是保存在连续的线性空间, 头插入和删除其代价都很大, 当数组满了还要重新寻找更大的空间; deque也是一个保存在连续的线性空间中, 但是它是一个双向开口, 头尾插入和删除都是O(1)的时间复杂度, 空间也是可扩展的, ...

2018-12-05 12:55:26 605

原创 STL源码分析之list有序容器 下

前言前两节对list的push, pop, insert等操作做了分析, 本节准备探讨list怎么实现sort功能.list是一个循环双向链表, 不是一个连续地址空间, 所以sort功能需要特殊的算法单独实现, 而不能用算法中的sort. 当然还可以将list的元素插入到vector中最后在将vector排序好的数据拷贝回来, 不过这种做法很费时, 费效率.list操作实现在分析sort之...

2018-12-04 20:36:31 445

原创 STL源码分析之list有序容器 中

前言上节分析了list的类型, 构造析构的实现, 本节我们着重探讨list的push, pop, 插入和删除等基本操作.list实际操作这里写了一些关于本节大都会用到的操作, 执行完后我们就来分析函数的具体实现.int main(){ list<int> List; List.push_back(1); List.push_front(0); List.push_ba...

2018-12-04 20:34:40 463

原创 STL源码分析之list有序容器 上

前言前几节我们分析了vector的实现, vector的缺点也很明显, 在频率较高的插入和删除时效率就太低了, 本节我们就来分析在频率较高的插入和删除很也很好的效率的list.list是用链表进行实现的, 而链表对删除, 插入的时间复杂度为O(1), 效率相当高, 但是随机访问的时间复杂度为O(n). list将具体实现分成几个部分, 通过嵌套的方式进行调用, 所以list实现也很灵活. 而且...

2018-12-04 20:32:22 666 1

原创 STL源码分析之vector序列容器 下

前言前面两节我们分析了关于vector的push, pop, erase, 重载和vector的定义, 通过前面的分析都对vector的实现有所了解了, 这一节我们就来分析vector是怎么实现插入操作. 当数组的大小不足后insert又是怎么来处理的.插入实现insert为了接受不同的参数和参数个数, 所以定义了多个重载函数. 现在我们就一个个来进行分析.insert(iterator ...

2018-12-04 10:30:40 506

原创 STL源码分析之vector序列容器 中

前言上一节我们分析了vector的构造, 析构, back, front等基本操作, 这一节我们就来分析vector实现插入, 删除等直接对数组具体操作的实现.vector例子与上节一样, 我们将待会会用到的部分常用的操作先执行一次, 进行一次快速的回忆.int main(){ vector<int> v1; vector<int&a

2018-12-04 10:28:52 581

原创 STL源码分析之vector序列容器 上

前言在STL编程中, 容器就是我们经常会用到的, 容器分为序列容器和关联式容器. 而这一篇我们就分析序列容器之一vector. 关于用过vector三的人肯定对其一点都不陌生, vector基本能够支持任何类型的对象, 同时是一个可以动态增长数组. 马上就来分析关于vector是怎么实现这些功能.vector的简单调用相信都对vector有一定的认识, 这里我就将本节会讲到关于vector源...

2018-12-04 10:25:34 993

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除