
STL
Mr.禾
这个作者很懒,什么都没留下…
展开
-
C++ 写一颗红黑树 代码
红黑树代码#pragma onceconst bool rb_red = false;const bool rb_black = true;class node {public: node(int n, bool color_type = true) :val(n), color(color_type), left(nullptr), right(nullptr), parent(nullptr) {}; int val; node* left; node* right; node原创 2020-12-25 20:45:30 · 439 阅读 · 1 评论 -
STL 常用算法记录
文章目录accumulatefor_eachreplacereplace_ifaccumulate有的算法有两个版本,可以加入自己的比较函数改变原来算法的执行效果测试函数#include<iostream>#include <numeric>int func(int x, int y){ return x + 2 * y;}struct testclass { int operator()(int x, int y) { return x + 3 * y; }原创 2020-12-23 17:05:31 · 109 阅读 · 1 评论 -
红黑树原理分析 2-3-4树
2-3-4树2-3-4 树把数据存储在叫做元素的单独单元中。它们组合成节点,每个节点都是下列之一2-节点,就是说,它包含 1 个元素和 2 个儿子,3-节点,就是说,它包含 2 个元素和 3 个儿子,4-节点,就是说,它包含 3 个元素和 4 个儿子 。每个儿子都是(可能为空)一个子 2-3-4 树。根节点是其中没有父亲的那个节点;它在遍历树的时候充当起点,因为从它可以到达所有的其他节点。叶子节点是有至少一个空儿子的节点。同B树一样,2-3-4 树是有序的:每个元素必须大于或等于它左边的和它的原创 2020-12-22 17:28:00 · 392 阅读 · 0 评论 -
STL 标准库概念总述
文章目录STL总体架构迭代器iterator算法algorithm迭代器传入参数distance算法iterator_traits 萃取器算法中加入自己的函数STL总体架构迭代器iterator无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iterator)”来实现。那么,迭代器到底是什么呢?我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求原创 2020-12-20 21:52:44 · 355 阅读 · 1 评论 -
自定义pair模板类 带三个参数
mypair#include<iostream>#include<vector>#include <algorithm>#include<map>using namespace std;template<typename T1, typename T2, typename T3>class mypair {public: T1 first; T2 second; T3 third; mypair() :first(T1()原创 2020-12-19 19:46:10 · 1455 阅读 · 1 评论 -
STL源码分析 unordered_set容器
源代码来自sgi-2.91版本stl_hash_set.h文章目录unordered_set总述unordered_set类hash_set默认构造size()begin()、end()find()count()insert()erase()测试函数unordered_set总述先了解hash表(1)底层实现完全由hash表代替,最开始叫做hash_set,从实现原理来说unordered_set应该被称为函数适配器(2)对底层hash表来说,键值就是实值(3)hash表没有自动排序,所以相对于原创 2020-12-18 15:39:40 · 677 阅读 · 0 评论 -
STL源码分析 unordered_map容器
源代码来自sgi-2.91版本stl_hash_map.h文章目录unordered_map总述unordered_map类hash_map构造函数operator[]重载size()begin()、end()find()count()insert()erase()unordered_map总述先了解hash表(1)底层实现完全由hash表代替,最开始叫做hash_map,从实现原理来说unordered_map应该被称为函数适配器(2)对底层hash表来说,每个节点都有一个键值(key)和实值(原创 2020-12-18 15:39:15 · 670 阅读 · 0 评论 -
STL源码分析 哈希表(hashtable)
源代码来自sgi-2.91版本stl_hashtable.h哈希表概念哈希表又叫做散列表,本质来说就是充分利用空间的一种思想。(1)一块内存分为53块,并编号#0 - #52区号,存入的object也编号,5存入#5号,25存入#25号,59%53= 6,59号object也放入#6号,108%53= 2,108号object也放入#2号,那如果继续存入2号、55号object呢?它们会共占一块空间。为了解决空间碰撞,我们把#0-#52当成一个指针数组,每个#号指向一块链表,每次有重复号码进入时,就原创 2020-12-18 10:56:25 · 713 阅读 · 0 评论 -
STL源码分析 map容器
源代码来自sgi-2.91版本stl_map.h文章目录map总览map类map总览(1)map的底层实现实际上是一颗红黑树实现,从实现原理讲,map又被称为容器适配器(2)每次插入元素会调整红黑树位置,实现自动排序(3)key和data是组成一个pair<T,T>值,作为红黑树的value(4)不能插入相同元素值(5)不能修改key,但是可以修改datamap类#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <clas原创 2020-12-17 19:57:10 · 1111 阅读 · 0 评论 -
STL源码分析 set容器
源代码来自sgi-2.91版本stl_set.h文章目录set总述set类定义less< key>函数set构造函数begin() 、end()empty()size()find()count()insert()erase()set总述(1)set的底层实现实际上是一颗红黑树实现(2)每次插入元素会调整红黑树位置,实现自动排序(3)key和data是一个值,作为红黑树的value(4)不能插入相同元素值set类定义#ifndef __STL_LIMITED_DEFAULT_TE原创 2020-12-17 16:40:33 · 390 阅读 · 0 评论 -
STL源码分析 stack容器
文章目录stack总述stack类stack总述先了解deque容器->deque(1)因为deque容器双向push和pop的特性,所以stack的底层实现可以完全由deque代替,所以stack与其叫容器,不如叫deque的适配器。(2)不带iterator,不能遍历(3)底层实现不一定要deque,vector也可以,因为满足尾部push、pop特性stack类#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class T,原创 2020-12-16 21:57:26 · 169 阅读 · 0 评论 -
STL源码分析 queue容器
源代码来自sgi-2.91版本stl_queue.h文章目录queue总述queue类运算符重载queue总述先了解deque容器->deque(1)因为deque容器双向push和pop的特性,所以queue的底层实现可以完全由deque代替,所以queue与其叫容器,不如叫deque的适配器。(2)不带iterator,不能遍历(3)底层实现不一定要deque,vector也可以,因为满足尾部push、pop特性queue类#ifndef __STL_LIMITED_DEFAULT原创 2020-12-16 21:50:56 · 159 阅读 · 0 评论 -
STL源码分析 deque容器
源代码来自sgi-2.91版本stl_vector.h文章目录deque总览图iterator 迭代器定义迭代器operator- 重载deque类__deque_buf_size函数deque总览图iterator 迭代器定义#ifndef __STL_NON_TYPE_TMPL_PARAM_BUGtemplate <class T, class Ref, class Ptr, size_t BufSiz> //如果传入了BufSiz,使用以下定义struct __dequ原创 2020-12-16 21:16:53 · 441 阅读 · 0 评论 -
STL源码分析 vector容器
源代码来自sgi-2.91版本stl_vector.hvector总览图当capacity空间不足时,两倍扩充空间。vector类template <class T, class Alloc = alloc> //默认分配器为alloc,其原理是内存池机制class vector {public: typedef T value_type; //value_type为数据类型 /*以下是一些名称定义*/ typedef value_type* pointer;原创 2020-12-16 10:15:21 · 465 阅读 · 0 评论 -
STL源码分析 list容器
源代码来自sgi-2.91版本stl_list.h链表中节点的定义template <class T>struct __list_node { typedef void* void_pointer; void_pointer next; //指向前一节点 void_pointer prev; //指向后一节点 T data; //存储数据类型};list中的迭代器//list类中的定义typedef __list_iterator<T, T&am原创 2020-12-14 21:59:04 · 120 阅读 · 0 评论 -
STL alloc源码分析 sgi-2.91版本 (二)
refill函数分成两个部分1.chunk_alloc函数负责切割出一大块内存空间2.chunk_alloc()下面的代码负责对这片空间加工,切割成一个一个指定内存大小的内存块,并由free_list_link 连接起来。/* Returns an object of size n, and optionally adds to size n free list.*//* We assume that n is properly aligned.原创 2020-12-14 16:03:17 · 204 阅读 · 0 评论 -
STL alloc源码分析 sgi-2.91版本 (一)
先理解分配器原理->内存分配,再看源码。一级分配器当二级分配器分配内存失败时再调用一级分配器,4.9版本后去掉一级分配器//一级分配器template <int inst>class __malloc_alloc_template {private:static void *oom_malloc(size_t);static void *oom_realloc(void *, size_t);#ifndef __STL_STATIC_TEMPLATE_MEMBER原创 2020-12-14 16:02:59 · 272 阅读 · 0 评论 -
STL alloc分配内存原理
alloc(1)分配器分配内存,#0号分配8字节,#1号分配16字节,#2分配24字节,以此类推…(2)每次分配出20个块来存储数据,再额外分配20个块作为备用池(3)需要字节不一样时(此时需要64字节),从备用池切割,从20块变为10块来适配64字节大小。(4)无备用池可用,调用malloc获得内存,Roundup(1280>>4)是追加量,为了字节对齐,加速大文件的存取。(5)88字节的容器可以直接使用备用池,备用池余下240字节,此时共有4个不同大小的容器,调用了两次mall原创 2020-12-12 19:32:45 · 312 阅读 · 0 评论