【C++】STL中deque底层剖析
一、关于dequestd::deque ( double-ended queue ,双端队列)是有下标顺序容器,它允许在其首尾两端快速插入及删除。另外,在 deque 任一端插入或删除不会非法化指向其余元素的指针或引用。 与 std::vector 相反, deque 的元素不是相接存储的:典型实现用单独分配的固定大小数组的序列,外加额外的登记,这表示下标访问必须进行二次指针解引用,与之相比 vector 的下标访问只进行一次。 deque 的存储按需自动扩展及收缩。扩张 deque 比扩张 std::vector 更优,因为它不涉及到复制既存元素到新内存位置。另一方面, deque 典型地拥有较大的最小内存开销;只保有一个元素的 deque 必须分配其整个内部数组(例如 64 位 libstdc++ 上为对象大小 8 倍; 64 位 libc++ 上为对象大小 16 倍或 4096 字节的较大者)。 deque 上常见操作的复杂度(效率)如下: 随机访问——常数 O(1) 在结尾或起始插入或移除元素——常数 O(1) 插入或移除元素——线性 O(n) 二、底层结构(1)dequ ...
【C++】SGI二级空间配置器(内存池)
一、二级空间配置器中的内存池结构(1)内存池初始状态 (2)当外界使用内存池my_list.h 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618 ...
【C++】SGI一级空间配置器
一、SGI空间配置器介绍 一级配置器: 使用malloc / free 二级配置器: 申请/释放空间 使用手段 > 128字节 使用一级配置器malloc / free <= 128字节 使用使用内存池memory pool 注意:二级配置器有可能会使用一级配置器。 二、一级空间配置器的实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115#ifndef MY_ALLOC_H#define MY_ALLOC_H#include<iostream>namespace pzj{//开关语句#if 0#inc ...
【C++】空间配置器(construct、destroy)
一、类型萃取实现对象构建、析构(1)Object.h12345678910111213141516171819202122232425#ifndef OBJECT_H#define OBJECT_H#include <iostream>using namespace std;#if 1template<class _Ty>class Object{private: _Ty _val;public: Object(const _Ty& val = 0) : _val(val) { cout << "Object: " << _val << endl; } ~Object() { cout << "~Object()"<< endl; }};#endif#endif (2)my_iterator.h1234567891011121314151617181920212223242526272829 ...
【C++】类型萃取实现迭代器操作
一、关于迭代器操作 这里主要实现这两个函数的具体实现原理:类型萃取实现函数重载,从而达到不同类型容器中的迭代器都可以进行使用该函数advance和distance函数。并且不同的迭代器类型可以使用不同的方法,从而提高效率(例如随机迭代器正向移动5下,可以使用循环,也直接可以 += 5,很明显随机迭代器使用后者效率将O(n)提到了O(1))。 二、关于迭代器迭代器按照功能可分为五类:输入迭代器、输出迭代器、向前迭代器、双向迭代器、随机迭代器以下是这五类迭代器的继承关系: 三、实现advance既然该函数在iterator.h文件中,我们就仿照下my_iterator.h 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102#ifndef MY_ ...
【C++】类型萃取
一、类型萃取笔者目前以这种使用场景来解释什么是类型萃取,为什么需要类型萃取?看代码会更加明了。Demo.h12345678910111213141516171819202122232425262728293031323334353637383940414243444546#ifndef DEMO_H#define DEMO_H//为什么需要萃取器?//自设计的模板Object<_Ty>类型template<class _Ty>class Object{private: _Ty value;public: Object(_Ty val = 0) : value(val) {} ~Object() {} const _Ty Value()const { return value; } _Ty Value() { return value; }};//自设计模板容器Container<_Container>类型template<class _Co ...
【C++】STL中vector容器使用总结
一、vector (1)区分size()和capacity()size():返回容纳的元素个数capacity():返回当前分配存储的容量 (2)迭代器失效 (3)区分const_iterator和const iteratorconst_iterator:常性迭代器,指向的对象的属性为常性;const iterator:常性的普通迭代器,迭代器自身属性为常性; (4)区分reserve()和resize()reserve():预留存储空间,只改变capacity增加 vector 的容量到大于或等于 new_cap 的值。若 new_cap 大于当前的 capacity() ,则分配新存储,否则该方法不做任何事。reserve() 不更改 vector 的 size 。若 new_cap 大于 capacity() ,则所有迭代器,包含尾后迭代器和所有到元素的引用都被非法化。否则,没有迭代器或引用被非法化。 123456789101112131415161718192021222324252627282930#include <iostream>#include < ...
【设计模式】工厂模式的map优化
一、有map,无unique_ptr版本(1)代码Factory.h123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596#ifndef FACTORY_H#define FACTORY_H#include <iostream>#include <string>#include <memory>#include <map>using namespace std;//有map//抽象产品类class Products{public: //产品方法 virtual void productMethod() = 0;};//car产品类class car : public Products{public: ...
【C++】shared_ptr的环状引用问题
一、环状引用举个栗子: 123456789101112131415161718192021222324252627282930313233#include <iostream>#include <memory>//环形引用class B;class A{public: shared_ptr<B> _b; A() { cout << "A()" << endl; } ~A() { cout << "~A()"<< endl; }};class B{public: shared_ptr<A> _a; B() { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; }};void fun()& ...