STL源码剖析
文章平均质量分 83
taxue505
网络 信息安全 互联网
展开
-
STL源码剖析——vector
vector和array的区别:vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。 array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。 vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。原创 2016-06-07 19:53:59 · 1512 阅读 · 1 评论 -
STL源码剖析——set
SET是STL中的标准容器,SET里面的元素会根据键值自动排序,它不像map那样拥有实值value和键值key的对应,set只有实值。SET的底层实现时RB-tree,当插入到RB-tree中后,其值不能再更改,因为更改就意味着可能不符合RB-tree的特性了,所以其迭代器set::iterator是RB-tree的constrant iterator。由于SET底层是RB-tree,所以SE原创 2016-06-17 09:10:16 · 1503 阅读 · 0 评论 -
STL源码剖析——map
map是STL中的标准关系容器,它存储的元素时pair,拥有键值key和实值value。按照键值key存储到红黑树中。map中不允许两个键值相同的元素。当元素插入到红黑树中后,键值key不可以再修改,但是其实值value可以修改,因为map的迭代器不是constant iterator,而是mutable iterator。G++ 2.91.57,cygnus\cygwin-b20\inc原创 2016-06-17 09:24:05 · 465 阅读 · 0 评论 -
STL源码剖析——multiset
STL中的set不允许键值重复,因此就有了multiset。multiset和set操作一样,功能一样,但是multiset允许键值重复,在使用红黑树的插入操作是,用的是insert_equal,而set用的是insert_unique,其他代码一样。G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_multiset.h 完整列表/* * * C原创 2016-06-17 10:05:20 · 358 阅读 · 0 评论 -
STL源码剖析——multimap
multimap和map的关系和multiset和set关系一样,multimap允许有重复的键值,它在使用底层数据结构红黑树用,插入操作用的是insert_equal,而不是insert_unique。G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_multimap.h 完整列表/* * * Copyright (c) 1994 * Hew原创 2016-06-17 10:06:20 · 676 阅读 · 0 评论 -
STL源码剖析——hashtable
二叉搜索树具有对数时间的搜索复杂度,但是这样的复杂度是再输入数据有足够的随机性的假设上哈希表在插入删除搜索操作上也具有常数时间的表现,而且这种表现是以统计为基础,不需要依赖输入元素的随机性hashtable提供对任何有名项的存取操作和删除操作,可以视为一种字典结构,负载系数:元素个数除以表格大小,除非使用开链,负载系数永远在0,1之间碰撞的解决方原创 2016-06-17 13:38:39 · 2202 阅读 · 0 评论 -
STL源码剖析——hash_set和hash_multiset
STL只规定接口和复杂度,对于具体实现不作要求。set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现。hash_set的接口,hash_table都提供了,所以几乎所有的hash_set操作都是直接调用hash_table的函数而已。除了hash_set,还有hash_multiset,它们两个的关系就像set和multiset原创 2016-06-18 09:21:32 · 526 阅读 · 0 评论 -
STL源码剖析——hash_map和hash_multimap
SGI STL中的map底层以红黑树实现,hash_map以hash table实现。hash_map不允许插入重新键值,hash_multimap允许插入重复键值。这两者的关系就像map和multimap的关系。底层的hash table提供的大部分的操作,hash_map(hash_multimap)大部分都是直接调用hash table的函数。hash_multimap和ha原创 2016-06-18 09:26:20 · 1691 阅读 · 0 评论 -
STL源码剖析——stl_numeric.h
在STL中,算法是独立于特定的数据结构,称为泛型算法。本节介绍的数值算法是在源码SGI STL中的文件,具体功能详见下面的源码剖析,在源码剖析的时候,针对每个元素都给出了使用例子,这样可以增加对其理解。#ifndef __SGI_STL_INTERNAL_NUMERIC_H#define __SGI_STL_INTERNAL_NUMERIC_H__STL_BEGIN_NAMESPAC原创 2016-06-18 15:28:40 · 1710 阅读 · 0 评论 -
STL源码剖析——stl_algobase.h
STL标准中没有区分基本算法或复杂算法,单SGI把常用的一些算法定义在只中,其他算法定义在中。stl_algobase.h中的算法,比较值得学习的是copy(),它“无所不用其极”的改善效率。copy的目的是复制一段元素到指定区间,复制操作最容易想到赋值操作符=,但是有的赋值操作符=是trivial的,可以直接拷贝。关于赋值操作符=是不是trivial的,可以参考“Member原创 2016-06-20 10:52:55 · 3440 阅读 · 0 评论 -
STL源码剖析——set相关算法
STL中定义的set要求元素不得重复且已经排序。而set算法要求的都是有序区间(输出也是有序的),但元素可以重复出现。STL提供了4个set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。一般而言,se原创 2016-06-20 11:54:24 · 1542 阅读 · 0 评论 -
STL源码剖析——仿函数(函数对象)
1 仿函数也称为函数对象,是一种具有函数特质的对象。调用者可以像函数一样的使用这些对象,例如在很多STL算法中,都可以看到,我们可以将一个方法作为模板内的参数传入到算法实现中,例如sort的时候我们可以根据我们传入的自定义的compare函数来进行比较排序。解决办法是使用函数指针,或者是将这个“操作”设计为一个所谓的仿函数,再用这个仿函数生成一个对象,并用这个对象作为算法的一个参数。原创 2016-06-20 16:20:32 · 838 阅读 · 0 评论 -
Algorithm中Heap
介绍algorithm头文件中根的相关函数make_heap(首位置, 尾位置+1, 可选的cmp函数); -> 构造堆push_heap(首位置, 尾位置+1, 可选的cmp函数); -> 添加元素到堆中pop_heap(首位置, 尾位置+1, 可选的cmp函数); -> 从堆中移出元素sort_heap(首位置, 尾位置+1, 可选的cmp函数); ->原创 2016-07-29 17:29:44 · 691 阅读 · 0 评论 -
STL源码剖析——stl_tree.h
STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率。红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索、插入、删除都能以O(nlogn)时间完成。平衡可以在一次或者两次旋转解决,是“性价比”很高的平衡二叉树。RB-tree(red black tree)红黑树是平衡二叉树。它满足一下规则(1)每个节点不是红色原创 2016-06-17 08:56:58 · 1952 阅读 · 0 评论 -
STL源码剖析——红黑树(RB-tree)
本套源码剖析把重点放在红黑树的3种插入情况,与红黑树的4种删除情况。其余的能从略则尽量简略。目录:一、左旋代码分析二、右旋三、红黑树查找结点四、红黑树的插入五、红黑树的3种插入情况六、红黑树的删除七、红黑树的4种删除情况八、测试用例好的,咱们还是先从树的左旋、右旋代码,开始(大部分分析,直接给注释)://一、左旋代码分析/*------转载 2016-06-16 22:51:12 · 631 阅读 · 0 评论 -
STL源码剖析——RB-tree
一、红黑树概述 红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。这一点在我们了解了红黑树的实现原理后,就会有更加深切的体会。 红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL转载 2016-06-16 22:43:32 · 1699 阅读 · 0 评论 -
STL源码剖析——vector
// Filename: stl_vector.h// Comment By: 凝霜// E-mail: mdl2009@vip.qq.com// Blog: http://blog.csdn.net/mdl13412/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permissi转载 2016-06-07 19:56:10 · 360 阅读 · 0 评论 -
STL源码剖析——list
相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。 list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vecto原创 2016-06-07 20:04:26 · 1851 阅读 · 0 评论 -
STL源码剖析——空间配置器
SGI STL 源码下载:SGI-STL-v3.31. 空间配置器概述STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收。STL标准为空间配置器定义了标准接口(可见《STL源码剖析》P43)。而具体实现细节则由各编译器实现版本而不同。下面介绍SGI STL中的allocator(实际叫alloc)配置器。 空间配置器概述:原创 2016-06-05 14:59:57 · 516 阅读 · 0 评论 -
STL源码剖析——迭代器
“迭代器是连接容器和算法的纽带,它们为数据提供了一种抽象的观点,使写算法的人不必关心多种多样的数据结构的具体细节。”----- SGI STL 3.3中的stl_iterator_base.h 和stl_iterator.h两个头文件中定义了跟迭代器相关的一些类。本文首先会介绍迭代器的基本概念,然后分析与迭代器相关的五种类型及traits(萃取)方法,最后简要介绍迭代器的几种适配器。原创 2016-06-06 13:09:01 · 461 阅读 · 0 评论 -
STL源码剖析——迭代器的分类与使用方法
五类迭代器1、输入迭代器:只读,一次传递为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是,输入迭代器可以对读操作的结果进行解析(对每个值仅解析一次),然后向前移动。2、输出迭原创 2016-06-06 13:14:47 · 374 阅读 · 0 评论 -
STL源码剖析——内存管理
STL中诸多容器和算法都要涉及到向系统申请和释放内存,所以先读读C++的内存管理—-C++称其为allocator1, default allocatorSGI STL 的头文件defalloc.h中有一个符合标准的名为allocator的内存分配器,它只是简单地将::operator new 和::operator delete做了一层薄薄的封装。在SGI STL的容器和算法部分从来没有用到这个内转载 2016-06-06 20:21:54 · 612 阅读 · 0 评论 -
STL源码剖析——deque
一、deque的中控器deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector。array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓的成长原是个假象,事实上是(1)另觅更大空间;(2)将原数据复制过去;(3)释放原空间三部曲。如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂。 de原创 2016-06-14 21:50:27 · 2142 阅读 · 0 评论 -
STL源码剖析——slist
slist是SGI STL里面的一个单向链表,不过这个不属于标准定义,所以,G++下面不能用,另外看了下VS2008里面也没有。不过看到书上这一部分讲解,还是配合SGI的代码做一个了解。一般情况下使用标准的list就可以满足要求了,而且会更加方便,list的分析可以参考STL笔记之list一文。因为slist是单向链表,所以它的迭代器类型为forward_iterator。1. slist原创 2016-06-15 10:16:20 · 603 阅读 · 0 评论 -
STL源码剖析——stack
stack容器配接器stack是一种“先进后出”的数据结构,它只能在栈顶对数据进行操作,即只能在栈顶进行新增元素、移除元素、取得最顶端元素。不能进行遍历行为,所以不需要设计自己的迭代器。在SGI STL的源码的设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型。 由于源码比较短,同时是基于其他容器进行操作的,这里只给出源码的剖析原创 2016-06-15 10:29:22 · 810 阅读 · 0 评论 -
STL源码剖析——queue
stack 是一种配接器(adapter),以某种容器作为底部结构,改变其接口,使之符合"先进先出"的特性。SGI STL 默认以 deque 为 stack 底部结构,没有遍历行为,没有遍历器。queue是一种先进先出(First In First Out, FIFO)的数据结构,它在前后有两个出口,分别成为队头和队尾.queue允许在队尾追加元素和访问队尾元素, 在队头获取和移除元素,原创 2016-06-15 10:48:41 · 749 阅读 · 0 评论 -
STL源码剖析——heap
Heap堆是常用的数据结构,Heap中也可以存放元素。但是STL中并没有提供Heap容器,只是提供了关于Heap操作的算法。只要支持RandomAccessIterator的容器都可以作为Heap容器。Heap分为max heap和min heap,max heap中每次取出的结点时heap结构中值最大的结点,min heap中每次取出的结点时heap结构中值最小的结点。在实际应用中,经常原创 2016-06-15 11:03:23 · 2481 阅读 · 0 评论 -
STL源码剖析——priority_queue
一、概述priority_queue,首先它是一个queue,即只允许在低端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径(故priority_queue不提供遍历功能,也不提供迭代器);再次它具有priority,即queue中的元素具有一定的priority:其内的元素自动依照元素的权值排列,权值最高者(也就是数值最高),排在最前面。注:在queue并非原创 2016-06-15 11:23:31 · 594 阅读 · 0 评论 -
自定义结构体vector的排序
C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?有两种方法,下面的例子能很好的说明: 方法1: 我们直接来看代码吧,比较简单,容易理解:#include "stdafx.h"#include #include原创 2016-07-29 17:44:05 · 3587 阅读 · 0 评论