重温《STL源码剖析》笔记 第四章

                  源码之前,了无秘密  ——侯杰

第四章:序列式容器

  C++语言本身提供了一个序列式容器array

  array:分配静态空间,一旦配置了就不能改变。

  vector:

    分配动态空间。维护一个连续线性空间,迭代器类型为:Random Access Iterators

    空间配置 typedef simple_alloc<value_type, Alloc> data_allocator

    所谓动态增加空间大小,并不是在原空间之后接续新空间,而是以原大小的两倍另外配置一块较大

    的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,

    对vector的任何操作,一旦引起空间重新配置的话,指向原vector的所有迭代器就都失效了,

    这是程序员易犯的一个错误。

    可用的方法或函数:begin, end, size, capacity, empty, front, back, find, erase, clear, insert,

    push_back, pop_back

  list:非连续空间

//配置,释放,构造,销毁一个节点
protected:
    //配置一个节点并传回
    link_type get_node() {
        return list_node_allocator::allocate();
    }
    //释放一个节点
    void put_node(link_type) {
        list_node_allocator::deallocate(p);
    }
    //产生(配置并构造)一个节点,带有元素值
    link_type create_node(const T& x) {
        link_type p = get_node();
        construct(&p->data,x);    //全局函数,构造/析构基本函数
        return p;
    }
    //销毁(析构并释放)一个节点
    void destroy_node(link_type p) {
        destroy(&->data);
        put_node(p);
    }

  remove(const T& value) -> 将数值为values的所有元素移除

  void list<T,Alloc>::unique() ->移除数值相同的连续元素。注意是“连续”

  list的方法和函数: begin, end, empty, size, front, back,  find, insert, erase, clear, remove,

  push_front, push_back, pop_front, pop_back, unique, [ sort, splice, merge, reverse -> transfer

  deque:双向开口的连续线性空间,迭代器类型Random Access Iterator, 但是迭代器非常复杂,

  要维护一个地址队列

  与vector的差异:

      一在于deque可以常数时间内对起头端进行插入或移除操作

      二在于deque没有所谓容量的观念,动态的以分段连续空间组合而成,随时可以增加一段新的

      空间并链接起来。

  deque的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口,

  避开了重新配置,复制,释放的轮回,代价则是复杂的迭代器架构。

  deque的方法和函数:

  begin,end, empty, size, front, back, find, insert, erase, clear, push_front, push_back,

  pop_front, pop_back, reverse_map_at_back(size-type,node_to_add=1)

  reverse_map_at_front(size_type, node_to_add=1)

  stack:没有迭代器

  方法或函数:empty, size, top, push, pop     stack<int, list<int>> istack

  queue:empty, size, front, back, push, pop         queue<int, list<int>> iqueue

  heap:扮演priority queue的助手 使用binary max heap

  方法或函数:push_heap, pop_heap(first, last), sort_heap, make_heap

  

  priority_queue: empty,size, top, push, pop

  slist:单向链表

  方法或函数:size,begin,end, find, insert

时间: 2024-10-12 15:05:50

重温《STL源码剖析》笔记 第四章的相关文章

《STL源码剖析》——第四章、序列容器

 1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供vector,list,deque,stack,queue,priority-queue 等等序列式容器.其中stack和queue由于只是将 deque 头换面而成,技术上被归类为一种配接器(adapter).  2.vector vector的数据安排以及操作方式,与array非常相似.两者的唯一

stl源码剖析-序列式容器 之 list

较久以前学过数据结构,对链表的定义和行为结构有过了解,所以阅读源码学习stl定义的list容器的并不算吃力. list与vector都是两个常用的容器,与vector不同,list不是连续线性空间的,list是一个双向链表.每次插入或者删除一个元素,将配置或者释放一个元素空间,因此,list对于空间的运用有着绝对的精准,不会造成浪费现象.而且对于任何位置的元素插入或者删除,其操作时间永远是常数时间.(缺点是不能进行随机的访问) list节点 list链表本身和list节点是分开设计的,以下是li

《STL源码剖析》---stl_tree.h阅读笔记

STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率.红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索.插入.删除都能以O(nlogn)时间完成.平衡可以在一次或者两次旋转解决,是"性价比"很高的平衡二叉树. RB-tree(red black tree)红黑树是平衡二叉树.它满足一下规则 (1)每个节点不是红色就是黑色. (2)根节点是黑色. (3)如果节点为红色,则其子节点比为黑色. (4)任何一个节

《STL源码剖析》---stl_hashtable.h阅读笔记

在前面介绍的RB-tree红黑树中,可以看出红黑树的插入.查找.删除的平均时间复杂度为O(nlogn).但这是基于一个假设:输入数据具有随机性.而哈希表/散列表hash table在插入.删除.查找上具有"平均常数时间复杂度"O(1):且不依赖输入数据的随机性. hash table的实现有线性探测.二次探测.二次散列等实现,SGI的STL是采用开链法(separate chaining)来实现的.大概原理就是在hash table的每一项都是个指针(指向一个链表),叫做bucket.

《STL源码剖析》---stl_alloc.h阅读笔记

这一节是讲空间的配置与释放,但不涉及对象的构造和析构,只是讲解对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本的STL对空间的的申请和释放做了如下考虑: 1.向堆申请空间 2.考虑了多线程.但是这节目的只是讲解空间配置与释放,因此忽略了多线程,集中学习空间的申请和释放. 3.内存不足时的应变措施 4.考虑到了内存碎片的问题.多次申请释放小块内存可能会造成内存碎片. 在C++中,内存的申请和释放是通过operator new函数和operator delete函数,这两个函数相当于C语

[转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依序巡防某个聚合物(容 器)所含的元素,而又无需暴露该聚合物的内部表达式.可见她的主要作用便是能够降低耦合,提高代码的 模块性. STL的的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合 在一起,这贴胶着剂便是迭代器.迭代器的行为类似智能指针(例如标准库的auto_pt

《STL源码剖析》---stl_uninitialized阅读笔记

这节讲解在已分配但未初始化的空间上构造对象(可能是一段内存,构造多个对象). 使内存的配置与对象的构造分离开来.在未初始化的内存上构造对象时,会先判断对象类型是否是POD类型.POD全称是Plain old data,也就是标量类型(基本类型和指针类型)或者传统的C struct类型.POD类型有trivial的constructor.deconstructor.copy.assignment(构造.析构.复制构造函数.赋值操作符)操作,所以对POD类型采用最有效的复制手法,而对non-POD类

《STL源码剖析》---stl_pair.h阅读笔记

pair是STL中的模板类型,它可以存储两个元素,它也被称作"对组".在map中已经用到了它,pair其实就是一个struct结构,存有两个public的元素,重载了几个运算符,没有什么成员函数,源代码很简单. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_pair.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy,

《STL源码剖析》---stl_iterator.h阅读笔记

STL设计的中心思想是将容器(container)和算法(algorithm)分开,迭代器是容器(container)和算法(algorithm)之间的桥梁. 迭代器可以如下定义:提供一种方法,能够依序寻访某个容器内的所有元素,而又无需暴露该容器的内部表达方式. 在阅读代码之前,要先了解一个新概念:Traits编程技法 template <class T> struct MyIter { typedef T value_type //内嵌型别声明 T *ptr; MyIter(T *p = 0

通读《STL源码剖析》之后的一点读书笔记

[QQ群: 189191838,对算法和C++感兴趣可以进来] 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了ST