protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simple_alloc<pointer,Alloc> map_allocator; //用来配置指针的alloc deque(int n,const value_type& value) :start(),finish(),map(),map_size() { fill_initialize(n,…
//---------------------------15/3/13---------------------------- self&operator++() { ++cur; if(cur==last) { set_node(node+); cur=first; } return *this; } self operator++(int)   //这里不能返回引用,因为 tmp是临时变量,作用域结束tmp就消失了 { self tmp=*this; ++*this; return tmp…
//--------------------------15/3/12---------------------------- deque { deque没有容量(capacity)观念,是动态分段的,没有reserve(保留)功能; 缓存区大小默认为,表示有bytes; 以map作为主控: //map { map是连续的空间,每个元素称为节点(node),都是一个指针,指向另一段连续的线性空间,称为缓存区: 缓存区是deque的储存主体: } //class { > class deque {…
//---------------------------15/03/24---------------------------- //hashtable { /* 概述: sgi采用的是开链法完成hashtable的,也就是用链表来存储映射到相同位置的元素. */ //node(节点) template<class Value> struct __hashtable_node { __hashtable_node* next; Value val; }; //bucket维护的linked…
// //  set map.cpp //  笔记 // //  Created by fam on 15/3/23. // // //---------------------------15/03/23---------------------------- //set { /* set概述: 1:所有的元素都会被自动排序, 2:所有的元素只有"键"没有"值" 或者说他们的"值"就是"键" 3:不允许出现两个相同的键值 4…
// //  RB_tree_STL.cpp //  笔记 // //  Created by fam on 15/3/21. // // #include "RB_tree_STL.h" //---------------------------15/03/21---------------------------- RB_tree { /* 一个由上而下程序: 为了避免父子节点皆为红色的情况持续向上层发展,形成处理时效上的瓶颈,可以从上向下处理, 假设新增的节点为a,那就沿着a的路…
// //  priority_queue.cpp //  笔记 // //  Created by fam on 15/3/16. // // //---------------------------15/03/16---------------------------- //priority_queue { /* priority_queue概述: 同正常队列一样,队尾进,队首出,不过不是先进后出, 有权值的概念,所以会自动排序(并不是全部排序,只要保证队 首值最大即可,权值最高的最先出队…
// //  heap.cpp //  笔记 // //  Created by fam on 15/3/15. // // //---------------------------15/03/15---------------------------- //heap { /* heap概述: heap并不是stl的容器,只是priority queue(优先队列)的助手 它允许用户以任意顺序插入容器,但是取出是,总是取出优先级最高的元素 heap用的是很常见的堆结构,用数组来表示,采用堆排序…
// //  stack.cpp //  笔记 // //  Created by fam on 15/3/15. // // //---------------------------15/03/15---------------------------- //stack { /* stack概述: stack只采用deque的底部操作,封装了deque,形成stack 这种方式是常见的adapter设计模式,stack往往不被归类为container 而是被归类为 container ada…
//---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调用::operator new配置内存(底层使用malloc来申请内存). 2>调用函数的构造函数,构造对象内容. delte和new一样,先调用析构函数,再调用::operator delete释放内存. 2:为了效率,stl把两个阶段分开来. 1>内存配置操作: alloc::allocate…
//---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都作用在由迭代器[first,last)所标示出来的区间上.质变算法 就是 运算过程会更改区间内的元素内容 非质变算法:和质变算法相反 */ /* stl算法的一般形式 1>所有的泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间 2>stl习惯采用前闭后开区间…
//****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标记 算法名称              算法用途         质变                   所在文件 accumulate          元素累计            否                   <stl_numeric.h> adjacent_differenc…
//---------------------------15/03/22---------------------------- //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多的东西,在第7章会详细介绍 //现在只知道KeyOfValue()可以构造一个类调用他的operator()可以得到一个value的key //允许重复的插入 template<class Key,class Value, class KeyOfValue,class Compare, class…
//---------------------------15/04/03---------------------------- /* 配接器概述: 1:adapter是一种设计模式:将一个class的接口转换为另一个class的接口,使得原本因接口不兼容而 不能合作的classes可以一起工作. 2:改变仿函数接口的,称为function adapter,改变容器接口的,称为container adapter, 改变迭代器接口的,称为iterator adapter. 3:container…
//---------------------------15/04/01---------------------------- //仿函数是为了算法而诞生的,可以作为算法的一个参数,来自定义各种操作,比如比大小,返回bool值,对元素进行操作等 //虽然这些函数也能实现,但是如果配合配接器(adapter)可以产生更灵活的变化. //为了使对象像函数一样,就必须重载operator() //unary_function template<class Arg, class Result> s…
//---------------------------15/04/01---------------------------- //inplace_merge(要求有序) template<class BidirectionalIterator> inline void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last) { if(first…
//---------------------------15/03/31---------------------------- //lower_bound(要求有序) template<class ForwardIterator, class T> inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value) { return __lower_bound…
//---------------------------15/03/30---------------------------- //min_element template<class ForwardIterator> ForwardIterator min_element(ForwardIterator first, ForwardIterator last) { if(first == last) return first; ForwardIterator result = first…
//---------------------------15/03/29---------------------------- //****************************set相关算法***************************** /* 1>set相关算法一共有4种:并集(union),交集(intersection),差集(difference), 对称差集(symmetric difference). 2>set相关算法只接受set/multiset. 3…
//---------------------------15/03/26---------------------------- //hash_set { /* hash_set概述: 1:这是一个hash版本的set,RB_tree版本的set有自动排序功能, 而hash_set没有这个功能. 2:hash_set的使用方式,与set完全相同. */ //class template<class Value, class HashFcn = hash<Value>, class Eq…
侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器,知道了不同的数据结构都有自己专属的迭代器,不同的迭代器也有不同的特性,由于算法的接口是统一的,通过迭代器的不同属性,算法自动选择正确的执行流程,在完全任务的同时,也尽可能提高算法的执行效率.那算法如何获知迭代器的属性呢?这一光荣的任务就是traits完成的.在STL实现中,traits编程技术得到大量的运用…
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型…
本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依序巡防某个聚合物(容 器)所含的元素,而又无需暴露该聚合物的内部表达式.可见她的主要作用便是能够降低耦合,提高代码的 模块性. STL的的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合 在一起,这贴胶着剂便是迭代器.迭代器的行为类似智能指针(例如标准库的auto_pt…
STL迭代器种类 2. 迭代器型别使用范例: 3. SGI STL空间配置器分为两级: 4. Vector 的内部存储方式为数组,随机访问迭代器. 5. Vector的size获取方式: 6. Vector的empty的判断方式: 7. Vector空间增长规律: 8. Unlitialized_copy的实现: 9. List内部存储方式是环状双链表,双向迭代器. 10. List的size获取方式: 11. List的empty判断方式: 12. Deque的存储结构:双层Map,随机访问迭…
不学STL,无以立.--陈轶阳 从1.1节到1.8节大部分都是从各方面介绍STL, 包括历史之类的(大致上是这样,因为实在看不下去我就直接略到了1.9节(其实还有一点1.8.3的内容)). 第一章里比较实用(能用在自己代码当中)的部分应该就是1.9节可能令你困惑的C++语法这部分了. 而1.9中又分为以下几个小节: 1.9.1 stl_config.h 中的各种组态(configurations) 1.9.2 临时对象的产生和运用 1.9.3 静态常量整数成员在class 内部直接初始化 1.9…
一.为什么需要traits编程技术 前面说了很多关于traits的光荣事迹,但是却一直没有介绍traits究竟是个什么东西,究竟是用来干什么的?traits在英文解释中就是特性,下面将会引入traits技术的作用,一步一步地揭开其神秘的面纱. 1.1 内嵌类型声明 1.1.1 以迭代器所指对象的类型声明局部变量 下面是一个以迭代器为模板形参的函数模板: template<typename Iterator> void func(Iterator iter) { //函数体 }   templa…
template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy(InputIterator first, InputIterator last,ForwardIterator result) 函数使用示例 #include <algorithm> #include <iostream> #include <memory> #inclu…
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们不会觉得数组容量太小不合需求,但是随着数据量的增加, 数组尺寸大小不再满足需求,此时我们需要手动的去扩展其大小.然而vector就帮我们完全实现了一个可 自适应增长的数组功能.那么这样看来vector其实也就是一种可自适应增长的动态数组的类的实现. 2.关于vector的定义 其实用过vector的…
直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了STL中算法的连续性和紧密型,使得各算法不需要考虑具体的数据结构.…
声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助. 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法各种常见算法,如sort,search,copy,erase等,我觉得其中比较值得学习的就是sort,next_pe…