
STL相关
lynalmost
这个作者很懒,什么都没留下…
展开
-
SGISTL源码阅读十 Vector容器下
SGISTL源码阅读十 Vector容器下前言之前我们已经对vector进行了比较深入的学习,本文章继续讲解vector的其他相关操作深入源码pop_back void pop_back() { --finish; destroy(finish); }pop_back的作用是将最后一个元素清除。eraseerase操作只负责销毁元素,而不负责释放空间 ...原创 2018-11-12 21:56:54 · 172 阅读 · 0 评论 -
SGISTL源码阅读七 (__type_traits)
SGISTL源码阅读七 (__type_traits)前言而这篇博客要介绍到的__type_traits是负责萃取型别的类型,通过萃取用来区分对应类型的构造、析构、赋值这些方法需要怎么处理。例如has_trivial_default_constructor判断是否有默认构造函数。我们知道对象的创建是需要构造的,而C++基本类型则不用。这样做也就是为了提高效率。深入源码//简单的两个结构...原创 2018-11-12 12:26:50 · 322 阅读 · 0 评论 -
SGISTL源码阅读十九 set关联式容器
SGISTL源码阅读十九 set容器前言之前我们已经分析了vector,list,deque三个容器。如果按照“数据在容器中的排列”特性,容器可以分为序列式(sequence)和关联式(associative)两种,前面学习过的三种容器都是序列式容器。接下来我们将学习关联式容器。标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体muiltiset(多键集合...原创 2018-11-14 13:20:03 · 263 阅读 · 0 评论 -
SGISTL源码阅读二十 map关联式容器
SGISTL源码阅读二十 map关联式容器前言map是一种关联式容器,底层同样是红黑树实现的,所有的元素都会根据元素的键值自动被排序。map中所有的元素pair,pair将两个数据合成一个,将pair的第一个值视为键值,第二个值视为实值,非常符合key``````value的要求。我们知道set保证了数据的唯一性,map也一样,在map中不允许两个元素拥有相同的键值。深入源码map的定义...原创 2018-11-14 15:23:45 · 429 阅读 · 0 评论 -
SGISTL源码阅读二十一 piar的实现
SGISTL源码阅读二十一 piar的实现前言在之前set和map的学习中,我们已经见过了pair,它的作用就是把一对值封装成一个。而且这一对值可以是不同数据类型的,对于set和map来说是绝佳的选择。深入源码pair的定义及拷贝构造函数template <class T1, class T2>struct pair { //声明别名 typedef T1 firs...原创 2018-11-14 15:45:51 · 234 阅读 · 0 评论 -
SGISTL源码阅读八 Vector容器上
SGISTL源码阅读八 Vector容器上Vector概述array是静态的数组,一经定义大小不可改变,这对于未知数组大小的情况来说是非常不利的,如果没有vector我们只能猜测一个较大的值来初始化数组。这无疑对空间造成了很大程度上的浪费,而且如果初始值过小,就得必须自己重新定义一个更大的数组,并且将原来的数据拷贝一份,再释放掉原来的空间。vector被称为动态数组。随着元素的加入,它的内部...原创 2018-11-12 19:25:14 · 274 阅读 · 0 评论 -
SGISTL源码阅读九 Vector容器中
SGISTL源码阅读九 Vector容器中前言在上一篇文章中我们了解了Vector的基本结构、构造以及内存分配,但是对于Vector的动态性并未涉及。接下来我们继续学习vector的一些相关操作,从中我们可以看到vector是如何进行内存控制的深入源码push_backvoid push_back(const T&amp; x) { //判断vector的使用量是否达到最大值...原创 2018-11-12 21:08:31 · 205 阅读 · 0 评论 -
SGISTL源码阅读二十二 hashtable上
SGISTL源码阅读二十二 hashtable上前言hashtable的部分基本知识hashtable,哈希表,也可称为散列表。哈希表用于以常数平均时间执行插入、删除和查找操作,每个关键字按照某种规定被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。时间复杂度可以达到常数级别听起来让人觉得很兴奋,但是它也是需要付出代价的,哈希表的一个最重要的问题就是解决冲突...原创 2018-11-14 17:41:30 · 236 阅读 · 0 评论 -
SGISTL源码阅读二十三 hashtable下
SGISTL源码阅读二十三 hashtable下前言之前介绍了hashtable的基本结构和它的构造方法,现在我们继续来学习它的迭代器和一些常用方法。深入源码hashtable的迭代器//迭代器的声明template &amp;lt;class Value, class Key, class HashFcn, class ExtractKey, class EqualKe...原创 2018-11-14 20:08:57 · 208 阅读 · 0 评论 -
SGISTL源码阅读二十四 hash_set 关联式容器
SGISTL源码阅读二十四 hash_set 关联式容器前言前面我们已经分析了set和hashtable,set的底层容器是红黑树,而接下来我们要分析的hash_set,是底层为hashtable的集合。深入源码hash_set的定义部分#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Value, class Has...原创 2018-11-14 21:26:13 · 170 阅读 · 0 评论 -
SGISTL源码阅读二十五 hash_map 关联式容器
SGISTL源码阅读二十五 hash_map 关联式容器前言前面我们已经分析了底层容器为红黑树的map和hashtable,而接下来我们要分析的hash_map,其底层容器为hashtable。深入源码hash_map的定义部分#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate &lt;class Key, class T, class H...原创 2018-11-16 20:43:10 · 194 阅读 · 0 评论 -
SGISTL源码阅读 算法 前言
SGISTL源码阅读 算法 前言STL有六大组件,我们已经分析了空间配置器、迭代器和容器,现在将进入对算法的学习。STL中实现了很多极具复用价值的算法,排序(sorting),查找(searching),排列组合(permutation),用于数据移动、复制、删除、比较、组合、运算等的算法。所有STL算法都作用在由迭代器[first,last)所标示出来的范围内,在进入正式分析算法之前,我们先...原创 2018-11-19 10:04:11 · 333 阅读 · 0 评论 -
SGISTL源码阅读二十六 数值算法 (stl_numeric.h)
SGISTL源码阅读二十六 数值算法 (stl_numeric.h)前言上一篇博客我们简要介绍了一下STL中的算法,所有的数值算法都是放在<stl_numeric.h中的。深入源码accumulate该算法是做累加操作,将指向范围的元素累加到init上,并且将init作为返回值返回,若init为0,则是计算迭代器指定范围值的累加和。要求迭代器类型至少为InputIterator/...原创 2018-11-19 11:21:35 · 344 阅读 · 0 评论 -
SGISTL源码阅读二十七 基本算法 (stl_algobase.h)
SGISTL源码阅读二十七 基本算法 (stl_algobase.h)前言SGISTL将一些基本常用的算法定义于stl_algobase.h中,其他的一些算法定义于slt_algo.h中,下面我们分析stl_algobase.h中的一些算法。深入源码__iter_swap&&swap//交换两个迭代器//版本1template <class ForwardIt...原创 2018-11-19 13:05:56 · 302 阅读 · 0 评论 -
SGISTL源码阅读十八 queue(队列)
SGISTL源码阅读十八 queue(队列)前言和上一篇文章提到过的stack一样,queue也是一种配接器(adapter),它们的实现非常类似。它是一种(First In First Out,FIFO)的数据结构,也没有提供遍历或指定位置访问等操作,只能从末端添加元素,顶部取出元素,所以它也没有迭代器。深入源码queue的定义部分#ifndef __STL_LIMITED_DEFA...原创 2018-11-14 11:01:57 · 266 阅读 · 0 评论 -
SGISTL源码阅读十七 stack(栈)
SGISTL源码阅读十七 stack(栈)前言前面我们已经学习了序列式容器vector,list和deque。本次要进行分析的是stack,它是一种先进后出(First In Lat Out,FILO)数据结构,在学习数据结构的时候应该都接触过,在这里stack是一个配接器(adapter),它默认以deque容器作为它的底部结构实现。接下来我们深入源码进行学习。配接器具有这种“修改某...原创 2018-11-14 10:32:01 · 397 阅读 · 0 评论 -
STL标准模板库简介
STL简介STL(Standard Template Library),标准模板库。它是为了建立数据结构和算法的一套标准,并且降低其间的耦合关系而产生,它给我们带来了一套极具实用佳置的零部件,以及一个整合的组织。(文章之后会介绍它的六大组件)它所实现的,是依据泛型思维架设起来的一个概念结构,以抽象概念为主题形成了严谨的接口标准,使得其组件都有最大的独立性。STL的版本很多,常见的有HP S...原创 2018-11-10 13:01:45 · 296 阅读 · 0 评论 -
SGISTL源码阅读一 空间配置器上(第一级配置器__malloc_alloc_template)
SGISTL源码阅读一 空间配置器上(第一级配置器)引入我们所熟知的C++内存配置操作一般为class A {}A* pa = new A(); //1.分配内存 2.构造对象delete pa; //1.对象析构 2.释放内存其中new完成了两个操作1.调用operator new配置内存2.调用A::A()构造对象这样做没有考虑到任何效率上的强化,如果有些空间根本不...原创 2018-11-10 14:58:39 · 419 阅读 · 0 评论 -
SGISTL源码阅读十一 list容器上
SGISTL源码阅读十一 list容器上list概述之前我们学习了连续线性空间的vector,当容量不够用时它会简单粗暴地直接扩大到原来的两倍,难免会造成一定的空间浪费。而list就不一样,它的好处是每插入或者删除一个元素,就配置或释放一个元素空间。它对空间的使用绝对精准,一点也不浪费。而且在元素的插入删除操作上,时间复杂度是常数级别,对于vector插入删除操作相当的麻烦。深入源码l...原创 2018-11-13 11:17:57 · 214 阅读 · 0 评论 -
SGISTL源码阅读十二 list容器中
SGISTL源码阅读十二 list容器中前言在list容器上中我们介绍了list的数据结构,构造,空间分配等。接下来我们继续分析list的一些相关操作。深入源码begin()/end//返回头节点iterator begin() { return (link_type)((*node).next); }const_iterator begin() const { return (li...原创 2018-11-13 14:42:36 · 213 阅读 · 0 评论 -
SGISTL源码阅读十三 list容器下
SGISTL源码阅读十三 list容器下前言我们将继续介绍list的相关操作深入源码removeremove的作用是删除指定值的节点template <class T, class Alloc>void list<T, Alloc>::remove(const T& value) { iterator first = begin(); ite...原创 2018-11-13 15:09:21 · 161 阅读 · 0 评论 -
SGISTL源码阅读二 空间配置器中(第二级配置器__default_alloc_template)
SGISTL源码阅读一 空间配置器下(第二级配置器__default_alloc_template)引入SGI空间配置器的做法是,如果区块勾搭,超过了128bytes,就移交给第一级配置器处理。当区块小于128bytes时就是第二级配置器要做的事情了。SGI的第二级配置器维护了16个__free-lists__,各自管理的大小分别是8,16,24,32,···,128bytws的小额区块,以...原创 2018-11-11 14:15:18 · 343 阅读 · 0 评论 -
SGISTL源码阅读三 空间配置器下(内存池memory pool)
SGISTL源码阅读三 空间配置器下(内存池memory pool)前言在上一个博客我们讲述了空间配置器的第二级配置器,它的关键点free-lists是依赖于内存池的。在refill中我们通过调用chunk_alloc函数来申请区块,chunk_alloc的作用就是从内存池中取空间给free-lists使用。下面我们通过源码来解读它。深入源码template <bool thread...原创 2018-11-11 15:16:33 · 322 阅读 · 0 评论 -
SGISTL源码阅读四 对象的构造与析构
SGISTL源码阅读四 对象的构造与析构前言前面我们提到,SGISTL将空间配置和对象的构造分开操作了,前面的文章我们对空间配置已经做了描述,下面我们来看一下如何构造和析构对象。深入源码construc//接受一个指针和一个初值template <class T1, class T2>inline void construct(T1* p, const T2& v...原创 2018-11-11 15:46:03 · 291 阅读 · 0 评论 -
SGISTL源码阅读十四 deque容器上
SGISTL源码阅读十四 deque容器上deque概述之前我们学习过vector,我们知道他的扩容方式是从尾部扩容,也就是它是单向开口的。deque比vector和list都要更复杂一些,它是双向开口的,也就是说可以在头部和尾部做同样的操作(我们要向vector的头部添加一个元素代价是相当大的,需要将所有元素向后移动,但是对于deque来说,在头部和尾部操作都是同样的时间复杂度)。这样看起来...原创 2018-11-13 18:09:18 · 235 阅读 · 0 评论 -
SGISTL源码阅读十五 deque容器中
SGISTL源码阅读十五 deque容器中前言我们已经学习了deque的数据结构和它的迭代器,接下来我们继续学习它的构造及内存申请等内容。深入源码deque的构造函数默认构造函数/* 指针数组不申请空间 * 并且first和finish迭代器也调用默认构造函数 */public: deque() : start(), finish(), map(0), map_...原创 2018-11-13 19:27:51 · 221 阅读 · 0 评论 -
SGISTL源码阅读五 迭代器上(迭代器的五种相应型别associated types)
SGISTL源码阅读五 迭代器上(迭代器的五种相应型别associated types)前言之前在对STL的简介中说到过,迭代器的作用是将数据结构(容器)和算法粘合在一起,我们可以将它理解成smart pointer,它是一种行为类似指针的对象。什么是相应型别?最初看到这个翻译觉得这个概念特别高大上,但是我们不要把它想得太复杂。大家应该比较熟悉sizeof()吧,我们可以调用它来获取变量...原创 2018-11-11 20:38:41 · 512 阅读 · 0 评论 -
SGISTL源码阅读十六 deque容器下
SGISTL源码阅读十六 deque容器下前言通过之前的学习我们对deque已经有了一个比较深入的了解,如图所示:接下来将继续学习deque的相关操作深入源码插入操作向deque末尾插入一个元素void push_back(const value_type& t) { //如果deque还有足够的容量 if (finish.cur != finish.last - ...原创 2018-11-13 22:45:54 · 204 阅读 · 0 评论 -
SGISTL源码阅读六 迭代器下(iterator_traits)
SGISTL源码阅读六 迭代器中(traits编程技法)####前言上一篇博客我们了解了迭代器的相应型别,简单的参数推导机制可以实现针对不同的类型进行不同的操作,但是这并不能解决所有的情况。本文章将要介绍_STL源代码门钥_——traits编程技法。凡是原生指针,都没有能力定义自己的相应型别,它们不是一种class type,traits编程技法利用模板偏特化解决了这个问题。声明内嵌型别...原创 2018-11-12 11:20:15 · 228 阅读 · 0 评论 -
SGISTL源码阅读 map与hash_map之间的区别
SGISTL源码阅读 map与hash_map之间的区别前言之前我们已经学习过了这两种关联式容器,他们可以用来存放键值对,并且不可存放重复键值(因为内部调用了insert_unique),他们所提供的很多插入删除方法也是非常类似的。现在我们来分析一下他们之间的区别。我们知道map的底层容器是红黑树,hash_map的底层是hashtable,所以他们之间的区别主要是由他们底层的容器来带的,...原创 2018-11-17 11:08:54 · 323 阅读 · 0 评论