源码解析
文章平均质量分 94
Icoding_F2014
相信代码可以变化世界
展开
-
STL里面的一个硬编码的Hash函数
今天看STL hash_map的源码的时候,出于好奇,我看了一个stl里面是用使用什么哈希函数,把key的转换为哈希值的,猜测这里的哈希函数肯定是基于线性同余变种过来的。为什么要对key做变化?这是因为我们使用map的时候,我们会指定某个键值对:key和value。比如{“name”:“jmh”},在c++内部就会先使用一个pair把这种二元关系对存储下来,然后在对key计算哈希值,用hash值来...原创 2019-12-30 11:46:14 · 1022 阅读 · 0 评论 -
C++ map和hash_map的性能对比
map和hash_map都是C++里面提供的关联容器,它们都支持高性能的插入、删除、查找操作。map内部是基于红黑树来实现的,而hash_map是基于线性同余哈希+开链解决冲突 来实现的。注意,hash_map并未纳入C++标准之中,因此不同厂商的STL库的hash_map的接口、性能保障可能会有出入。在C++11中,hash_map被正式纳入到STL里面,但是换了个名字:unordered_...原创 2019-12-23 11:14:07 · 4038 阅读 · 0 评论 -
STL源码分析:map
STL里面map是基于一颗红黑树来实现的,map其实是对红黑树的接口做了一下封装。对于底层的红黑树来说,map底层的红黑树的实例化为: typedef rb_tree<key_type, value_type, select1st<value_type>, key_compare, Alloc> rep_type;而value...原创 2019-12-22 22:35:51 · 413 阅读 · 1 评论 -
STL 源码分析: RB_tree 红黑树(三) 插入和查找
插入rb_tree里面有两类插入函数, pair<iterator,bool> insert_unique(const value_type& x); iterator insert_equal(const value_type& x);一个是insert_unique(),另外一个是insert_equal();insert_unique就是整颗树里面,...原创 2019-12-09 23:20:01 · 819 阅读 · 0 评论 -
STL 源码分析: RB_tree 红黑树(二)
STL的红黑树在stl_tree.h 头文件实现了。首先stl_tree.h就有一段话:/Red-black tree class, designed for use in implementing STLassociative containers (set, multiset, map, and multimap). Theinsertion and deletion algorit...原创 2019-12-07 16:02:22 · 333 阅读 · 0 评论 -
STL 源码分析: RB_tree 红黑树 (一)
前言今天,来看看大名鼎鼎的红黑树。红黑树的定义啥子叫做红黑树?首先,红黑树是一颗二分查找树。二分查找树的递归定义是,一个树是二叉查找树,它的左右子树也是二叉查找树,而且根节点的数值域大于所有左子树子孙数值域,小于等于所有右子树数值域。其次,红黑树是一颗平衡二分查找树。啥叫平衡二分查找树呢?wiki是这么说的:In computer science, a self-balancing ...原创 2019-12-07 11:59:16 · 285 阅读 · 0 评论 -
STL源码分析: list的sort函数
今天,来看看STL里面的sort函数,这个排序函数真是让人眼前一亮啊,有趣的很~·很奇怪的是里面居然硬编码了一个counter[64]??? 一个很naive的怀疑就是,这玩意的长度是硬编码进去的不会越界嘛????其实现为:template <class T, class Alloc>void list<T, Alloc>::sort() { if (node-...原创 2019-11-17 17:49:42 · 592 阅读 · 0 评论 -
STL源码分析:SGI STL的内存管理 allocator
前言今天来分析一个STL的alloc的源码,STL这么精妙的东西当然是会自己管理内存的啦~~·整体看下来,STL的内存管理比操作系统内存管理的简单太多了。。。整体轮廓STL源码里面,有两个allocator,一个被称为__malloc_alloc_template,另外一个被称为__default_alloc_template。__malloc_alloc_template被称为一级内存...原创 2019-11-08 07:16:38 · 608 阅读 · 2 评论 -
stl:: pair源码以及使用
前言本章 我们来介绍一下stl::pair模板.为什么要涉及这个东西嘞?这是因为在看LightGBM的时候经常看到pair出没。。。 其实pair就是一种二元关系,该关系定义了A,B两个集合的笛卡尔积 我们来看笛卡尔积的数学定义: 设存在集合A,B,我们定义集合A和B的乘积C.其中C=(a,b),s.t.a∈A,b∈BC=(a,b),s.t.a∈A,b∈BC={(a,b),s.t. a ...原创 2018-06-17 09:55:59 · 1122 阅读 · 1 评论 -
STL 源码分析之string(二)基础篇—append,reserve,assign
STL源码下载:https://www.sgi.com/tech/stl/download.html vs工程代码:http://download.csdn.net/download/jmh1996/10032316其中string类需要在3.1以后的版本才有定义。 如果对basic_string和_String_base结构不熟悉的可以随时看上一篇博客: STL源码分析之string(一)原创 2017-10-26 21:50:46 · 2461 阅读 · 1 评论 -
STL 源码分析之string(三)基础篇—insert,
STL源码下载:https://www.sgi.com/tech/stl/download.html vs工程代码:http://download.csdn.net/download/jmh1996/10032316其中string类需要在3.1以后的版本才有定义。 如果对basic_string和_String_base结构不熟悉的可以随时看上一篇博客: STL源码分析之string(一)原创 2017-10-28 10:40:18 · 681 阅读 · 0 评论 -
STL源码分析之vector(二)—核心函数 push_back及insert_aux
说明: STL源码分析系列博客的使用的是https://www.sgi.com/tech/stl/download.html 里面的STL v2.03版.不同的STL或许会有所不同。 其它vector内容请参照系列博客。主要函数分析迭代器相关:都是返回指针: iterator begin() //返回初始位置指针{ return start; }const_iterator begin()原创 2017-09-13 17:05:34 · 3149 阅读 · 0 评论 -
STL源码分析之vector(三)—其它函数 eraser()、operator[]和operator =
说明: STL源码分析系列博客的使用的是https://www.sgi.com/tech/stl/download.html 里面的STL v2.03版.不同的STL或许会有所不同。 其它vector内容请参照本系列其它博客。 STL源码分析之vector(一) 基本数据类型及构造函数STL源码分析之vector(二)—核心函数 push_back及insert_aux STL源码分析之vecto原创 2017-09-14 10:59:17 · 1742 阅读 · 0 评论 -
STL源码分析之deque,双端队列(一)
前言deque 双端队列,支持从两头push和pop数据,比一般的队列功能更加强大。也是一个常用的数据结构。本系列博客将来分析deque的实现源码。这个deque比之前看的vector复杂了一些。基础函数inline size_t __deque_buf_size(size_t n, size_t sz){ return n != 0 ? n : (sz < 512 ? size_t(512原创 2017-09-23 20:04:32 · 1027 阅读 · 0 评论 -
STL源码分析之vector(一) 基本数据类型及构造函数
说明: STL源码分析系列博客的使用的是https://www.sgi.com/tech/stl/download.html 里面的STL v2.03版.不同的STL或许会有所不同。工程文件可下载。前言C++ STL的vector 源码分析!主要介绍基本数据类型和构造函数!0. 主要成员变量及数据类型:template <class T, class Alloc = alloc>//模板参原创 2017-09-13 16:38:08 · 934 阅读 · 0 评论