![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL源码剖析
文章平均质量分 83
思翊
Hello , world.
展开
-
STL源码剖析 - 第6章 算法 - 6.7.8 部分元素排序算法
6.7.8 partial_sort, partial_sort_copy重新安排序列[first,last),使序列前半部分middle-first个最小元素以递增顺序排序,并将其置于[first,middle),相对于sort排序算法,只排序middle-first个元素,使用堆效率更高 ,其余last-middle个元素不指定任何排序,并将其置于[middle,last) 。注意原创 2015-03-19 16:24:52 · 452 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - set
5.3 set 在SGI STL中的容器set,其实现基本上是在RB-Tree的基础上,以RB-Tree作为其底层的实现机制,几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已。在set容器中键值key和实值value是相同的,且在容器里面的元素是根据元素的键值自动排序的,同时我们不能修改set容器里面的元素值,所以set的迭代器是采用RB-Tree的const_it原创 2015-03-12 16:03:31 · 508 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - RB-tree(红黑树)
5.1 树的导览 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。这些容器的底层机制均以RB-tree(红黑树)完成。RB-tree也是一个独立的容器,但并不开放给外界使用。此外,SGI STL还提供了一个不在标准规格之列的关联式容器:hash table(散列表),以及以此hash原创 2015-03-12 15:37:00 · 632 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - multiset
5.5 multiset multiset的特性及其用法和set完全相同,唯一的区别就是multiset允许键值key重复,因此multiset的插入操作采用的是底层RB-Tree的insert_equal()(可以插入重复的键)而非insert_unique()。本文的源码出自SGI STL中的文件。#ifndef __SGI_STL_INTERNAL_MULTISET_原创 2015-03-13 14:05:16 · 449 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - multimap
5.6 multimap multimap的特性及其用法和map完全相同,唯一的区别就是multimap允许键值key重复,因此multimap的插入操作采用的是底层RB-Tree的insert_equal()而非insert_unique()。本文的源码出自SGISTL中的文件。#ifndef __SGI_STL_INTERNAL_MULTIMAP_H#define __原创 2015-03-13 14:08:15 · 492 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - map
5.4 map 在SGI STL中的容器map,底层实现机制是RB-Tree,是因为map的操作RB-Tree都能实现。在map容器键值key和实值value是不相同的,键值key和实值value的比较函数也是不同的。在map容器里面的元素是根据元素的键值自动排序的,不能修改map容器的键值,但是可以修改容器的实值。map的所有节点元素都是pair。pair有两个成员变量first,s原创 2015-03-12 16:36:26 · 559 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - hashtable
5.7 hashtable前面介绍的关联容器set、multiset、map和multimap的底层机制都是基于RB-Tree红黑树,虽然能够实现在插入、删除和搜索操作能够达到对数平均时间,可是要求输入数据有足够的随机性。本文介绍的hashtable不需要要求输入数据具有随机性,在插入、删除和搜索操作都能达到常数平均时间。本文介绍的hash table是来自SGI STL中的文件,在这里为原创 2015-03-13 15:38:09 · 459 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - hash_set
5.8 hash_set hash_set以hashtable为底层机制。和set类似,hast_set的键值就是实值,实值就是键值,但是不同点是hash_set容器中的元素是没有排序的,因为hash table没有提供排序功能。hash_set的使用方式与set完全相同。本文源码出自SGISTL的文件。hash_set容器源码剖析#ifndef __SGI_STL_INTERNA原创 2015-03-13 15:56:37 · 457 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - hash_map
5.9 hash_map hash_map以hash table为底层机制,和map类似,每一个元素都同时拥有一个实值和一个键值,但是不同点是hash_map容器中的元素是没有排序的,因为hash table没有提供排序功能。本文源码出自SGI STL的文件。 hash_map源码剖析#ifndef __SGI_STL_INTERNAL_HASH_MAP_H#def原创 2015-03-13 16:05:15 · 443 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - hash_multiset
5.10 hash_multiset hash_multiset和hash_set的区别就像multiset与set的区别一样,hash_multiset的底层机制是基于hashtable,它可以存在重复的键值,所以插入函数使用insert_equal(),hash_multiset和hash_set一样,容器的内容不自动排序。本文源码出自SGI STL的文件。hash_mul原创 2015-03-13 16:06:09 · 444 阅读 · 0 评论 -
STL源码剖析 - 第5章 关联式容器 - hash_multimap
5.11 hash_multimap hash_multimap和hash_map的区别就像multimap与map的区别一样,hash_multimap的底层机制是基于hashtable,它可以存在重复的键值,所以插入函数使用insert_equal(),hash_multimap和hash_map一样,容器的内容不自动排序。本文源码出自SGI STL的文件。hash_mul原创 2015-03-13 16:09:54 · 644 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 三
1、 replace//将区间[first,last)内的所有old_value都以new_value替代. template void replace(_ForwardIter __first, _ForwardIter __last, const _Tp& __old_value, const _Tp& __new_value) { __ST原创 2015-03-18 16:04:16 · 457 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 二
1、 for_each将仿函数f施行于区间内的每一个元素上,但f不能改变元素的内容// for_each. Apply a function to every element of a range. //功能:Applies function fn to each of the elements in the range [first,last). //将仿函数f应用于[fir原创 2015-03-18 14:46:24 · 501 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.2 - 6.7.4 二分算法
6.7.2 、low_bound(应用于有序区间)//在已排序区间[first,last)查找value值 //若该区间存在与value相等的元素,则返回指向第一个与value相等的迭代器 //若该区间不存在与value相等的元素,则返回指向第一个不小于value值的迭代器 //若该区间的任何元素都比value值小,则返回last // Binary search (low原创 2015-03-18 16:42:50 · 514 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.5 - 6.7.6 排列组合算法
6.7.5、next_permutation获取[first,last)区间所标示序列的下一个排列组合,若果没有下一个排序组合,则返回false;否则返回true; /* 函数功能:Rearranges the elements in the range [first,last) into the next lexicographically greater permutation.原创 2015-03-18 16:46:21 · 392 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - ilist
4.9.1 slist概述 在STL标准中提供了双向链表list,本文介绍的是SGISTL中定义的单向链表slist。单向链表的迭代器是属于正向迭代器,所以在单链表进行插入元素时,在指定节点之后插入时时间是常数O(1),在指定节点之前插入时需要线性时间O(n)。相比于双向链表list,它所耗用的空间更小,某些操作更快。slist和list有一个共同的特殊是:它们的插入,移除,拼接等操作不原创 2015-03-11 15:44:14 · 417 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - priority_queue
4.8.1 priority_queue概述 priority_queue(优先队列)是拥有优先级的queue,不过它容器内的元素并不是根据加入顺序排列,而是根据用户定义的优先级进行排列。priority_queue只能在队列尾部加入元素,在头部取出元素。不能遍历容器,因此不需要自己设置迭代器。在SGI STL的源码的class priority_queue设计中,它是基于某种容原创 2015-03-11 14:57:29 · 442 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.9 sort(排序算法)
6.7.9 sort STL的所有关系型容器(set,map,multiset……)都拥有自动排序功能(底层结构采用RB-tree),不需要sort算法。序列式容器stack、queue和priority-queue不允许排序。剩下的vector、deque和list,前两个适合使用sort排序,list迭代器不属于随机存取迭代器,不适合使用sort排序。 STL的so原创 2015-03-19 16:36:42 · 674 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - list
4.3.1 list概述 在SGI STL中,list容器是一个循环的双向链表,它的内存空间效率较前文介绍的vector容器高。因为vector容器的内存空间是连续存储的,且在分配内存空间时,会分配额外的可用空间;而list容器的内存空间不一定是连续存储,内存之间是采用迭代器或节点指针进行连接,并且在插入或删除数据节点时,就配置或释放一个数据节点,并不会分配额外的内存空间,这两个操作过程原创 2015-03-08 17:07:25 · 543 阅读 · 0 评论 -
STL源码剖析 - 第2章 空间配置器
SGI STL源码下载地址 空间配置是为存储数据提供可用的空间,在Standard Template Library(STL)中,空间配置是最底层的东西,为容器提供服务。2.1 空间配置器的标准接口 空间配置器(Allocator)的主要实现文件是alloc.h和stl_alloc.h,标准接口位于文件stl_alloc.h的588-628行;具体如下:/*tih原创 2015-03-05 20:40:50 · 581 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.10 - 6.7.11 equal_range 和 inplace_merge
6.7.10、 equal_range(应用于有序区间) 查找区间与value相等的相邻重复元素的起始位置和结束位置 ,返回pair,前一个迭代器是lower_bound作用的返回值,后一个迭代器是uper_bound作用的返回值。lower_bound和uper_bound参考:http://blog.csdn.net/u012243115/article/details/4441原创 2015-03-20 14:40:56 · 472 阅读 · 0 评论 -
STL源码剖析 - 第3章 迭代器的概念与traits编程技法
在STL编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代器使其独立设计成为可能。Traits编程技术是STL中最重要的编程技术,Traits可以获取一个类型的相关信息。3.4 Traits编程技术 Traits可以获取一个类型的相关信息,首先我们看下面的程序:template void function(T原创 2015-03-07 13:55:13 · 519 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - vector
4.2 vector容器 在STL编程中,我们最常用到的就是容器,容器可分为序列容器和关联容器;本文记录的是我们经常使用的序列容器之vector,vector的数据安排和操作方式类似于C++内置数组类型array,唯一的区别就是在于空间的灵活运用。内置数组array是静态空间,一旦分配了内存空间就不能改变,而vector容器可以根据用户数据的变化而不断调整内存空间的大小。原创 2015-03-07 15:45:24 · 623 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法(algorithms) - 数值算法<stl_numeric.h>
6.3 数值算法 本节介绍的数值算法是在源码SGI STL中的文件,具体功能详见下面的源码剖析,在源码剖析的时候,针对每个元素都给出了使用例子,这样可以增加对其理解。numeric数值算法源码剖析#ifndef __SGI_STL_INTERNAL_NUMERIC_H#define __SGI_STL_INTERNAL_NUMERIC_H__STL_BEGIN_NAMESPA原创 2015-03-17 15:02:01 · 483 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法(algorithms) - 基本算法<stl_algobase.h>
6.4 基本算法 STL标准规格中并没有区分基本算法或复杂算法,然而SGI却把常用的一些算法定义于中,其他算法定义于中。这些常用的算法包含equal,fill,fill_n,iter_swap,lexicographical_compare,max,min,mismatch,swap,copy,copy_backward,copy_n。其中一个比较重要的算法就是copy,针对copy的剖原创 2015-03-17 15:28:33 · 574 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法(algorithms) - set相关算法
6.5 set相关算法 本节介绍set集合的相关算法,分别是并集set_union,交集set_intersection,差集set_difference,和对称差集set_symmetric_difference,这四个函数都提供了两个版本的函数原型:第一个版本是采用默认的排序比较方式operator接受的输入区间都是有序的(set内的元素默认有序,可接受multiset容器作为输入区原创 2015-03-17 16:32:40 · 506 阅读 · 0 评论 -
STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 一
6.7.1 单纯的数据处理1、adjacent_find//查找区间[first,last)内第一次重复的相邻元素 //若存在返回相邻元素的第一个元素位置 //若不存在返回last位置 /*该函数有两个版本:第一版本是默认操作operator==;第二版本是用户指定的二元操作pred 函数对外接口的原型: equality (1):默认操作是operator==原创 2015-03-17 17:25:32 · 471 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - deque
4.4.1 deque概述 deue是一种双向开口的分段连续线性空间,可以在头尾端进行元素的插入和删除。 deque和vector最大的差异就是:第一是deque允许于常数时间内对头端进行插入或删除元素;第二是deque是分段连续线性空间,随时可以增加一段新的空间;deque不像vector那样,vector当内存不够时,需重新分配/复制数据/释放原始空间;不过dequ原创 2015-03-10 15:10:25 · 581 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - stack
4.5.1 stack概述 stack是一种“先进后出”的数据结构,它只能在栈顶对数据进行操作,即只能在栈顶进行新增元素、移除元素、取得最顶端元素。不能进行遍历行为,所以不需要设计自己的迭代器。在SGI STL的源码的设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型,比如list或者vector。4.5.2 stack容器配接器原创 2015-03-10 15:38:43 · 481 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - queue
4.6.1 queue概述 queue是一种“先进先出”的数据结构,可以对两端进行操作,但是只能在队列头部进行移除元素,只能在队列尾部新增元素,可以访问队列尾部和头部的元素,但是不能遍历容器,所以queue不需要设计自己的容器。在SGI STL的源码的class queue设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型。4.6原创 2015-03-10 16:33:40 · 470 阅读 · 0 评论 -
STL源码剖析 - 第4章 序列式容器 - heap
4.7.1 heap概述 在STL中,heap并不是一种容器,而是一种算法,作为下一节的priority queue的助手,任何能够提供随机访问迭代器的容器都能支持heap的操作。heap不需要遍历内容,所以没有属于自己的迭代器。本文介绍的heap是基于vector容器的操作;有关堆的定义可以参考:http://blog.csdn.net/u012243115/article/detai原创 2015-03-11 14:32:08 · 504 阅读 · 0 评论 -
STL源码剖析 - function call操作符讲解(operator())
function call操作符(operator())C语言使用函数指针作为参数传入函数#include#includeusing namespace std;int fcmp(const void *elem1 , const void *elem2){ const int *i1 = (const int*)elem1; const int *i2 = (const原创 2015-05-18 15:49:00 · 492 阅读 · 0 评论