重温《STL源码剖析》笔记 第四章
源码之前,了无秘密 ——侯杰
序列式容器 关联式容器
array(build in) RB-tree
vector set
heap map
priority-queue multiset
list multimap
slist hashtable
deque hash_set
stack(配接器) hash_map
queue(配接器) hash_multiset
hash_multimap
第四章:序列式容器
C++语言本身提供了一个序列式容器array
array:分配静态空间,一旦配置了就不能改变。
vector:
分配动态空间。维护一个连续线性空间,迭代器类型为:Random Access Iterators
空间配置 typedef simple_alloc<value_type, Alloc> data_allocator
所谓动态增加空间大小,并不是在原空间之后接续新空间,而是以原大小的两倍另外配置一块较大
的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,
对vector的任何操作,一旦引起空间重新配置的话,指向原vector的所有迭代器就都失效了,
这是程序员易犯的一个错误。
可用的方法或函数:begin, end, size, capacity, empty, front, back, find, erase, clear, insert,
push_back, pop_back
list:非连续空间
//配置,释放,构造,销毁一个节点
protected:
//配置一个节点并传回
link_type get_node() {
return list_node_allocator::allocate();
}
//释放一个节点
void put_node(link_type) {
list_node_allocator::deallocate(p);
}
//产生(配置并构造)一个节点,带有元素值
link_type create_node(const T& x) {
link_type p = get_node();
construct(&p->data,x); //全局函数,构造/析构基本函数
return p;
}
//销毁(析构并释放)一个节点
void destroy_node(link_type p) {
destroy(&->data);
put_node(p);
}
remove(const T& value) -> 将数值为values的所有元素移除
void list<T,Alloc>::unique() ->移除数值相同的连续元素。注意是“连续”
list的方法和函数: begin, end, empty, size, front, back, find, insert, erase, clear, remove,
push_front, push_back, pop_front, pop_back, unique, [ sort, splice, merge, reverse -> transfer
deque:双向开口的连续线性空间,迭代器类型Random Access Iterator, 但是迭代器非常复杂,
要维护一个地址队列
与vector的差异:
一在于deque可以常数时间内对起头端进行插入或移除操作
二在于deque没有所谓容量的观念,动态的以分段连续空间组合而成,随时可以增加一段新的
空间并链接起来。
deque的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口,
避开了重新配置,复制,释放的轮回,代价则是复杂的迭代器架构。
deque的方法和函数:
begin,end, empty, size, front, back, find, insert, erase, clear, push_front, push_back,
pop_front, pop_back, reverse_map_at_back(size-type,node_to_add=1)
reverse_map_at_front(size_type, node_to_add=1)
stack:没有迭代器
方法或函数:empty, size, top, push, pop stack<int, list<int>> istack
queue:empty, size, front, back, push, pop queue<int, list<int>> iqueue
heap:扮演priority queue的助手 使用binary max heap
方法或函数:push_heap, pop_heap(first, last), sort_heap, make_heap
priority_queue: empty,size, top, push, pop
slist:单向链表
方法或函数:size,begin,end, find, insert
重温《STL源码剖析》笔记 第四章的更多相关文章
- 《STL源码剖析》——第四章、序列容器
1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...
- STL源码剖析读书笔记之vector
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...
- c++ stl源码剖析学习笔记(一)uninitialized_copy()函数
template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...
- 通读《STL源码剖析》之后的一点读书笔记
直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
- 面试题总结(三)、《STL源码剖析》相关面试题总结
声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...
- 《STL源码剖析》相关面试题总结
原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...
- STL源码剖析之组件
本篇文章开始,进行STL源码剖析的一些知识点,后续系列笔记全是参照<STL源码剖析>进行学习记录的 STL在现在的大部分项目中,实用性已经没有Boost库好了,毕竟STL中仅仅提供了一些容 ...
- 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
随机推荐
- Linux进程实践(3) --进程终止与exec函数族
进程的几种终止方式 (1)正常退出 从main函数返回[return] 调用exit 调用_exit/_Exit (2)异常退出 调用abort 产生SIGABOUT信号 由信号终止 Ctrl+ ...
- Linux Shell 脚本攻略学习--四
linux中(chattr)创建不可修改文件的方法 在常见的linux扩展文件系统中(如ext2.ext3.ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设 ...
- Ubuntu 14 安装WPS
在32位Ubuntu 14.04 安装 WPS,WPS For Linux版除延续Windows版相同体验外,更加尊重Linux用户特定的使用习惯:深度兼容:自带方正字体集:在线模板和素材使文档创作更 ...
- Pollution over East China : Image of the Day
acquired October 16, 2002download large image (2 MB, JPEG, 6000x4600) acquired October 16, 2002downl ...
- 《java入门第一季》之面向对象(面向对象案例详解)
通过几个小案例理重新回顾一下前面所写的内容,对面向对象的理解更加深刻的目的: 案例一: /* 需求: 定义一个员工类,自己分析出几个成员, 然后给出成员变量,构造方法,getXxx()/setXxx( ...
- TinySpring分析二
step5 看完了前面的几步,到现在我们必然要想到的问题就是,数据要是放在xml中怎么读? 其实按照正常思维一步一步来,从xml中读数据和之前手工配进去并没有什么大的区别,只要读出来就OK了. 先看测 ...
- Maven部署项目到Tomcat
首先需要用MyEclipse建立一个Maven项目 为了不报403错误,tomcat目录下的tomcat-user.xml文件的配置如下: setting.xml配置如下,大家关注下Server的配置 ...
- 基于ARM-contexA9按键驱动开发
之前我们写过LED和蜂鸣器的驱动,其实那两个都是一个模版的,因为都是将IO口配置成输出模式,然后用高低电平来驱动这些设备.其实linux设备驱动,说白了跟单片机开发的方式是差不多的,只不过内核的开发基 ...
- CIO必看:跨国集团采购部报表系统的建设经验分享
CIO必看:跨国集团采购部报表系统的建设经验分享 引言 福耀集团是国内最具规模.技术水平最高.出口量最大的汽车玻璃生产供应商,产品"FY"商标是中国汽车玻璃行业第一个"中 ...
- Machine Learning 学习笔记
点击标题可转到相关博客. 博客专栏:机器学习 PDF 文档下载地址:Machine Learning 学习笔记 机器学习 scikit-learn 图谱 人脸表情识别常用的几个数据库 机器学习 F1- ...