C++_泛型编程与标准库(七)

参考:《侯捷泛化编程与标准库》、VC2019

图中标红部分为自己的笔记理解

1、深度探索vector

  1. 笔者觉得在最新的VC2019下不是二倍增长,虽然是几何增长,但是增加的是之前的1/2;不是完全二倍增长

  2. 在VC2019的32位程序下,vector类型大小是16位的,其中包含了3个4位的功能同start,finish,end_of_storage的指针,还有4位是继承基类容器(_Container_base12)里的指针而来的四个字节;

    struct _Container_base12 {_Container_proxy* _Myproxy = nullptr;
    }
    template <class _Val_types>
    class _Vector_val : public _Container_base {public:pointer _Myfirst; // pointer to beginning of arraypointer _Mylast; // pointer to current end of sequencepointer _Myend; // pointer to end of array
    };
    

VC2019push_back()调用的是emplace_back(),而emplace_back()的处理方式与侯捷老师说的gnu2.9的类似

_CONSTEXPR20_CONTAINER void push_back(const _Ty& _Val) { // insert element at end, provide strong guaranteeemplace_back(_Val);//push_back()调用emplace_back()
}
template <class... _Valty>_CONSTEXPR20_CONTAINER decltype(auto) emplace_back(_Valty&&... _Val) {// insert by perfectly forwarding into element at end, provide strong guaranteeauto& _My_data   = _Mypair._Myval2;pointer& _Mylast = _My_data._Mylast;if (_Mylast != _My_data._Myend) {//判断现有内存是否够用return _Emplace_back_with_unused_capacity(_STD forward<_Valty>(_Val)...);}_Ty& _Result = *_Emplace_reallocate(_Mylast, _STD forward<_Valty>(_Val)...);//不够则增加内存
#if _HAS_CXX17return _Result;
#else // ^^^ _HAS_CXX17 ^^^ // vvv !_HAS_CXX17 vvv(void) _Result;
#endif // _HAS_CXX17}

2、GNU2.9的vector容器增长与VC2019的区别

  1. GNU2.9的增长

    大量调用构造与析构

  2. VC2019的增长,只增长之前的1/2

 template <class... _Valty>_CONSTEXPR20_CONTAINER pointer _Emplace_reallocate(const pointer _Whereptr, _Valty&&... _Val) {//重新分配内存// reallocate and insert by perfectly forwarding _Val at _Whereptr_Alty& _Al        = _Getal();auto& _My_data    = _Mypair._Myval2;//mypair是vector类中的_Compressed_pair的类型pointer& _Myfirst = _My_data._Myfirst;//获取数据头指针pointer& _Mylast  = _My_data._Mylast;//获取数据最新尾部指针_STL_INTERNAL_CHECK(_Mylast == _My_data._Myend); // check that we have no unused capacity//检查是否有没有用的空间const auto _Whereoff = static_cast<size_type>(_Whereptr - _Myfirst);const auto _Oldsize  = static_cast<size_type>(_Mylast - _Myfirst);//获取旧空间大小if (_Oldsize == max_size()) {_Xlength();}const size_type _Newsize     = _Oldsize + 1;//新空间等于旧空间+1const size_type _Newcapacity = _Calculate_growth(_Newsize);//新容量等于_Oldcapacity + _Oldcapacity / 2;或者_Newsizeconst pointer _Newvec           = _Al.allocate(_Newcapacity);//分配新内存,返回新空间地址(指针)const pointer _Constructed_last = _Newvec + _Whereoff + 1;pointer _Constructed_first      = _Constructed_last;//应当存放新data的空间_TRY_BEGIN//尝试构造_Alty_traits::construct(_Al, _Unfancy(_Newvec + _Whereoff), _STD forward<_Valty>(_Val)...);_Constructed_first = _Newvec + _Whereoff;if (_Whereptr == _Mylast) { // at back, provide strong guarantee_Umove_if_noexcept(_Myfirst, _Mylast, _Newvec);} else { // provide basic guarantee_Umove(_Myfirst, _Whereptr, _Newvec);_Constructed_first = _Newvec;_Umove(_Whereptr, _Mylast, _Newvec + _Whereoff + 1);}_CATCH_ALL//异常则释放空间_Destroy(_Constructed_first, _Constructed_last);_Al.deallocate(_Newvec, _Newcapacity);_RERAISE;_CATCH_END_Change_array(_Newvec, _Newsize, _Newcapacity);return _Newvec + _Whereoff;//返回新data数据指针
}
 _CONSTEXPR20_CONTAINER size_type _Calculate_growth(const size_type _Newsize) const {// given _Oldcapacity and _Newsize, calculate geometric growthconst size_type _Oldcapacity = capacity();const auto _Max              = max_size();if (_Oldcapacity > _Max - _Oldcapacity / 2) {return _Max; // geometric growth would overflow}const size_type _Geometric = _Oldcapacity + _Oldcapacity / 2;//在此处增加了之前1/2的空间if (_Geometric < _Newsize) {return _Newsize; // geometric growth would be insufficient}return _Geometric; // geometric growth is sufficient}

C++_泛型编程与标准库(七)相关推荐

  1. C++_泛型编程与标准库(十)——set与map

    C++_泛型编程与标准库(十)--set与map 参考:<侯捷泛化编程与标准库>.GNU9.3.0,vs2019 图中标红部分为自己的笔记理解 SET GNU 9.3.0的set部分代码如 ...

  2. C++_泛型编程与标准库(九)——红黑树的使用

    C++_泛型编程与标准库(九)--红黑树的使用 参考:<侯捷泛化编程与标准库>.GNU9.3.0,vs2019 图中标红部分为自己的笔记理解 struct _Rb_tree_node_ba ...

  3. C++_泛型编程与标准库(八)

    C++_泛型编程与标准库(八) 参考:<侯捷泛化编程与标准库>.GNU9.3.0,vs2019 图中标红部分为自己的笔记理解 1.array GNU 2.9的写法 array GNU9.3 ...

  4. C++_泛型编程与标准库(六)

    C++_泛型编程与标准库(六) 图中标红部分为自己的笔记理解 1.iterator几个特定属性 vc2019的链表list迭代器部分代码 // CLASS TEMPLATE _List_iterato ...

  5. C++_泛型编程与标准库(五)

    C++_泛型编程与标准库(五) 图中标红部分为自己的笔记理解 1.容器与容器之间的关系 2.深度探索list list是双向链表,从vc2019的list源码和以下图片都可以看出 template & ...

  6. C++_泛型编程与标准库(四)

    C++_泛型编程与标准库(四) 图中标红部分为自己的笔记理解 1.注意一个特化的typedefine 2.分配器 2.2.VC2019的allocator类 1. allocate调用operator ...

  7. C++_泛型编程与标准库(三)

    C++_泛型编程与标准库(三) 图中标红部分为自己的笔记理解 1.分配器简单测试,后面还会单讲 实测VC2019在Microsoft Visual Studio\2019\Community\VC\T ...

  8. C++_泛型编程与标准库(二)

    C++_泛型编程与标准库(二) 图中标红部分为自己的笔记理解 为什么快?因为是红黑树实现的(高度平衡树)

  9. C++_泛型编程与标准库(一)

    C++_泛型编程与标准库(一) 图中标红部分为自己的笔记理解

最新文章

  1. Nature子刊:加州大学伯克利分校Banfield组发现某些淡水湖泊中的大噬菌体或能加速好氧甲烷氧化...
  2. matlab pause
  3. mysql 历史版本下载
  4. pandas如何统计所有列的空值,并转化为list?
  5. 最近研究Rest,这个东西还是个雏形,给个好用的参考地址吧
  6. java重写重定向_JavaWeb请求转发与请求重定向理解
  7. c语言如何一直变换颜色,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...
  8. systemctl命令完全指南
  9. 1031. Hello World for U (20)-PAT甲级真题
  10. 销售订单的 状态 变更
  11. TP框架漏洞复现(持续更新)
  12. oracle删除临时会话表,新一代QQ群机器人
  13. quartusII实验报告
  14. C++ 一维高斯积分的实现
  15. Java机器学习库(Java ML)(一、分类)
  16. MSC-51单片机原理与实践——第四章习题及答案解析
  17. 微信公众号编辑排版规范(试行版)
  18. java word转html乱码怎么办,poi导出word 乱码 poi word转html 乱码
  19. mac使用Simulator打开IOS模拟器(不使用Xcode打开IOS模拟器)
  20. 【外贸收款】拉美银行BBVA介绍

热门文章

  1. Maptree-层级结构数据展示的绝佳尝试
  2. 【为自己相亲】单身小姐姐你在哪里,我是书豪,我在等你
  3. Nature Reviews:给医生的菌群分析指南(上)
  4. R语言plotly可视化:可视化直方图、归一化的直方图、水平直方图、互相重叠的直方图、堆叠的直方图、累积直方图、通过bingroup参数设置多个直方图使用相同的bins设置、自定义直方图条形的间距
  5. R语言使用yardstick包的roc_curve函数评估多分类(Multiclass)模型的性能、查看模型在多分类每个分类上的ROC曲线(roc curve)
  6. R语言ggplot2可视化彩色水平条形图并基于条形长度和数值标签长度、自定义最优化配置标签在条形内部或者条形外部
  7. R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票年收益率数据使用不同的色彩表征正收益率和负收益率
  8. sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
  9. R语言常用的统计函数
  10. 基因组测序数据分析:测序技术