开发成长之路(7)-- C++从入门到开发(C++知名库:STL入门·容器(二))

在这里插入图片描述

deque

vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。
所谓双向开口,也就是说可以在头尾两端进行插入和删除操作。

vector当然也可以做头部操作,但是其头部操作效率奇差!!!
无法被接受。
(这点以前居然都没有发现!!!)

在这里插入图片描述

deque没有所谓容量的观念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。因此,deque没有必要提供所谓的空间保留功能。

但是呢,为什么我们更多的选用vector而非deque呢?因为它的指针实在是太麻烦了。我们后面就知道了。

除非必要,我们应尽可能的选择使用vector而非deque。对deque进行的排序操作,为了最高效率,可以将deque完整的复制到一个vector身上,将vector排序后,再复制回deque。

不要被事务的表面现象锁迷惑,你看它是分段连续线性空间,就以为它是vector和list的结合体,取长补短?其实不然。
为了维持整体连续的假象,数据结构的设计及迭代器前进后退等操作都颇为繁琐。


deque的中控器

deque采用一块所谓的map映射,来看吧:

template <class T,class Alloc = alloc,size_t BufSiz = 0>
class deque{
public:
	typedef T value_type;
	typedef value_type* pointer;
	···
protected:
	//元素的指针的指针
	typedef pointer* map_pointer;

protected:
	map_pointer map;	
	//指向map,map是块连续空间,其内的每个元素都是一个指针,指向一块缓冲区
	
	size_type map_size;
	//map内可容纳多少指针
}

在这里插入图片描述

在这里插入图片描述

看得我尴尬症都犯了。

此外,deque还维护start、finish两个迭代器,分别指向第一缓冲区的第一个元素和最后缓冲区的最后一个元素(的下一个位置)。
此外,它当然也必须记住目前map的大小,一旦map的空间不足,必须要重新配置一个更大的map。


stack – 栈

什么是栈?怎么说呢,我觉得我真应该先写数据结构专栏。失策失策!!!
栈是一种先进后出的数据结构,它只有一个接口。
只能从一端加入元素,从那一端移除元素,所以并不被允许有其他方法来存取元素。
换言之,stack不允许有遍历行为。

将元素推入stack的方式称为push,将元素退出stack的操作称为pop。
在这里插入图片描述

以某种既有容器作为底部结构,将其接口改变,使之符合“先进后出”的特性,形成一个stack,是很容易做到的。

deque是双向开口数据结构,若以deque为底部结构并封闭其头端开口。
便轻而易举形成了一个stack、
(不知道为什么,我觉得好糟糕哦,vector是不能做吗?)

还是等我过两篇写数据结构的时候再说吧。


除deque之外,list也是双向开口的数据结构。以list为底的stack被称作链栈。

嘿我就挺纳闷儿,为什么就非要双向开口的数据结构???


queue – 队列

队列,是一种先进先出结构,只能从一端加入元素,从另一端移除元素,所以并不被允许有其他方法来存取元素。
换言之,queue不允许有遍历行为。

那这个跟上面的stack其实没多大区别,只不过一个是后进先出,一个是先进先出的罢了。那为什么也要双向开口的数据结构呢?


heap是什么

heap并不属于STL容器组件,它是个“幕后白手”,扮演priority queue的助手。

顾名思义,那个queue允许用户以任何次序插入数据,但是在插入的时候会根据优先级进行排序,以保证取出的时候是按照优先级排序的。

如果以List作为这个优先级队列的底层机制,那么排序将会很麻烦,如果以二叉搜索树的话,未免大材小用了。
而难度夹在中间的binary heap便是不二人选了。

所谓binary heap,就是一种完全二叉树,整棵树除了底层节点外,都是填满的,从左至右又不得又间隙。

苍白无力的文字啊,来看张图实在:
在这里插入图片描述
简单明了吧,可以用想象下面有一个数组来存储所有节点,以树根节点作为数组的[0]位置,可以发现,任何一个节点 [i] 的左子节点必位于 [2i] 处,其右子节点必位于 [2i+1] 处。
而任何一个节点 [k],其父节点必位于 [k/2] 处。

通过这简单的规则,咱就种了一棵树,完全二叉树。
而这颗二叉树需要能动态的增加节点,所以采用vector作为这棵树的底层土壤是个理想的选择。

根据元素排列方式,heap可以分为max-heap和min-heap。STL供应的是max-heap,最大值在头结点。

heap算法

push_heap算法(尾端插入元素)
本来是自己画了图,但是理解了书中的图之后,发现他的图更有一番风味。
在这里插入图片描述
原先我也疑惑于为何同一级中左边的节点会比右边节点大,后来我想明白了。
在插入过程中,这个顺序被打乱是难以避免的,况且这个排序于取出数据并无影响,所以没必要在做额外工作对树的底层做那么精细的排序。

如果还是不理解,先看下去,慢慢的就会茅塞顿开。

在尾部插入时,总是将节点插入到最底层的最右节点,不管你要插入的数据右多大,见上图第一个步骤。
插入之后执行上溯操作,将新节点拿来与父节点进行比较,如果“青出于蓝胜于蓝”,那么将父子节点互换位置。见上图第二个步骤。
之后持续执行上一个步骤,直到不再互换位置。见上图三、四个步骤。
至于下面被打乱的顺序,不用担心,乱中有序。

正是由于这波操作,使得同一级会出现左边的节点比右边的大的情况。

下面来看一下算法的实现细节:

//该函数接受两个迭代器,用来表现一个heap底部容器的头尾,并且新元素已经插入到底部容器的最尾端。

template <class RandomAccessIterator>
inline void push_heap(RandomAccessIterator first,RandomAccessIterator last)
{
	__push_heap_aux(first,last,distance_type(first),value_type(first));/*这俩type在上一篇提到了,不知道也就算了吧,毕竟上一篇也不短*/
}

template <class RandomAccessIterator,class Distance,class T>
inline void __push_heap_aux(RandomAccessIterator first,RandomAccessIterator last,Distance*,T*)
{
	__push_heap(first,Distance((last-first)-1),Distance(0),T(*(last - 1)));	//(last-first)-1,容器最尾端
}

template <class RandomAccessIterator,class Distance,class T>
void __push_heap(RandomAccessIterator first,Distance holeIndex,Distance topIndex,T value)
{
	Distance parent = (holeIndex - 1)/2;	//找出父节点
	while(holeIndex > topIndex && *(first+parent)<value)	//尚未到达顶端,且父节点小于新值,这个循环将父值不断下调
	{
		*(first + holeIndex) = *(first + parent);	//令新值为父
		holeIndex = parent;	//调节洞号,向上提升至父节点
		parent = (holeIndex -1)/2;	//新洞的父节点
	}
	*(first + holeIndex) = value;	//令洞值为新值,完成插入操作
}

看下来,果然会茅舍顿开吧。

pop_heap算法(头部插入元素)
看完上面的插入,可能会有人觉得这样打乱顺序的话取出会有问题,其实会有吗?不知道,看下去。

在这里插入图片描述
还是用书上的图啊。
取出元素时,首先将1根节点拿下来,留下一个洞洞,见上图第一步到第二步。
还要将当前树的最后一个节点拿下来,并将根节点放到尾节点在容器中的位置。见上图步骤二。
接下来将尾节点和原根节点的两个子节点比较大小,将大的那个推上根节点。见上图步骤三。同样留下一个洞洞。
循环这个“向下流放”的过程,直到原尾结点插入树中或者到了最底层。见上图步骤四。

看懂了这个图之后我们来看算法的实现细节:

template <class RandomAccessIterator>
inline void pop_heap(RandomAccessIterator first,RandomAccessIterator last)
{
	__pop_heap_aux(first,last,value_type(first));
}

template <class RandomAccessIterator,class T>
inline void __pop_heap_aux(RandomAccessIterator first,RandomAccessIterator last,Distance*,T*)
{
	__pop_heap(first,last-1,last-1,T(*(last - 1)),diatance_type(first));
}

template <class RandomAccessIterator,class Distance,class T>
void __push_heap(RandomAccessIterator first,RandomAccessIterator last,RandomAccessIterator result,T value,Distance*)
{
	*result = *first;	//设定尾值为首值,客端稍后可以pop_back()将值取出
	__adjust_heap(first,Distance(0),Distance(last - first),value);
}

template <class RandomAccessIterator,class Distance,class T>
void __adjust_heap(RandomAccessIterator first,Distance holeIndex,Distance len,T value)
{
	Distance topIndex = holeIndex;
	Distance secondChild = 2 * 	holeIndex+2;	//右节点
	while(secondChild < len)
	{
		if(*(first + secondChild) < *(first +(secondChild -1)))
			secondChild --;
		*(first + holeIndex) = *(first + secondChild);
		holeIndex = secondChild;

		secondChild = 2*(secondChild+1);	//找出新洞节点的有子节点
	}
	if(secondChild == len)	//没有右子节点了
	{
		*(first + holeIndex) = *(first + secondChild -1);	//令左子值为键值
		holeIndex = secondChild - 1;	//再把洞的位置下移
	}
	__push_heap(first,holeIndex,topIndex,value);
}

sort_heap算法(思想简介)
不断对heap进行pop操作,便可达到排序效果。
这个图可以根据上面两张图自行脑补,算法也可以自行脑补。

heap迭代器
嘿嘿,那当然是没有迭代器了,所有元素都必须遵循特别的排列规则,又不提供遍历功能,要什么迭代器。

make_heap (制造heap)
这个算法就是用来将现有的一段数据转化成一个heap。

思想不多说,直接看代码:

template<class RandomAccessIterator>
template <class RandomAccessIterator>
inline void make_heap(RandomAccessIterator first,RandomAccessIterator last)
{
	__make_heap(first,last,distance_type(first),value_type(first));
}

//不允许指定比较方法
template <class RandomAccessIterator,class Distance,class T>
void __make_heap(RandomAccessIterator first,RandomAccessIterator last,Distance*,T*)
{
	if(last - first <2)	return;
	Distance len = last - first;
	Distance parent = (len - 1)/2;	//找出临时父节点
	while(true)	//尚未到达顶端,且父节点小于新值,这个循环将父值不断下调
	{
		__adjust_heap(first,parent,len,T(*(first+parent)));
		if(parent == 0)	return;	
		parent--;
	}
}
已标记关键词 清除标记
<p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; font-size: 18px;"><strong>学习计划:</strong></span></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">1、每天学习1个小时,大概1个月完成。 2、认真听讲,要自己揣摩,明白原理。 3、动手实践、必须要多做课后练习题,遇到不会的,及时提问。</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">课程目标:</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">从一个纯小白,到真正理解变量的实质,指针的实质,学会C++类及面向对象编程</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">课程简介:</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><span style="max-width: 100%; box-sizing: border-box; font-size: 20px;"><strong><strong><strong>敬告:</strong></strong>该系列的课程在抓紧录制更新中,敬请大家关注。</strong></span></span></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>---------------------------------------------------</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> </p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> </p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>---------------------------------------------------</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><span style="max-width: 100%; box-sizing: border-box; font-size: 20px;"><strong>给学员(从小白到大牛)的3年学习路径及计划</strong></span></span></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">技术方面分三块:</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>1.纯开发技术方向</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>2.音视频流媒体专业方向</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>3.项目实战</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>---------------------------------------------------</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><strong>1.纯开发技术方向</strong></span></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(1) C++必须要过硬(至少学会10本经典好书)</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(3) 框架与工具(Qt、MFC):必须精通其中一种。</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(6) 最好学习点Java+Html+javascript等WEB技术。</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><strong>2.音视频流媒体专业方向</strong></span></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(1) 音视频流媒体基础理论:</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">    必须认真学会,否则看代码就是看天书</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(2) 编解码方向:精通h.264,h.265(hevc),</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> 包括理论和各个开源(ffmpeg,libx264,libx265,...)。</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...),</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> 钻研各个开源(live555,darwin,srs,zlmediakit,crtmpserver,...)</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(4) 视频监控:  理论+开源(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...)  </p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><strong>3.项目实战</strong></span></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(1) Qt项目:  至少要亲手练习10个实战项目</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(网络服务器、多线程、数据、图像处理、多人聊天、等等)</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">包括视频服务器、后台管理系统、前端播放器(多端)</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>---------------------------------------------------</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> </p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><img src="https://img-bss.csdnimg.cn/202101280710351145.jpg" alt="" /></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> </p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"><strong>具体的内容包括:</strong></p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> </p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;">n 1.全书概览与分析 5<br /><br />1.1 初步认识:做到心中有数 5<br /><br />1.2 图解:章节关系 6<br /><br />1.3 探讨:教学方法论 7<br /><br />1.4 探讨:学习方法论 7<br /><br />1.5 C++的1.0与2.0 8<br /><br />1.6 开发工具Qt5.9和VS2015/7/9 8<br /><br />控制台: 8<br /><br />UI界面: 8<br /><br />1.7 安装并搭建Qt5.9.8开发环境 9<br /><br />1.下载软件Qt Creator 5.9.8 9<br /><br />2.双击开始安装 9<br /><br />3.注册Qt账号 11<br /><br />4.激活Qt账号 12<br /><br />5.选择安装路径 17<br /><br />6.选择“安装组件” 19<br /><br />7.同意“许可协议” 21<br /><br />8.点击“安装”后,请喝杯茶 24<br /><br />1.8 捋起袖子开干:几个小案例 35<br /><br />第一:写代码打印“CS”图形 36<br /><br />第:写代码打印各种图形(作业) 36<br /><br />1.9 原书第一章剖析 37<br /><br />1.计算机是什么? 37<br /><br />2.程序是什么? 38<br /><br />3.程序设计 38<br /><br />4.C++入门程序示例 40<br /><br />n 第2章 C++基础知识 41<br /><br />2.1 变量和赋值 41<br /><br />2.2 输入和输出 42<br /><br />2.3 数据类型和表达式 43<br /><br />2.4 简单控制流程 44<br /><br />2.5 程序风格 45<br /><br />2.6 x=x-3到底是个什么鬼? 46<br /><br />第3章 更多的控制流程 47<br /><br />3.1 使用布尔表达式 47<br /><br />3.2 多路分支 48<br /><br />3.3 C++循环语句详解 48<br /><br />3.4 设计循环 51<br /><br />3.5 课堂练习 51<br /><br />第4章 过程抽象和返回值的函数 52<br /><br />4.1 自顶向下设计 52<br /><br />4.2 预定义函数 53<br /><br />4.3 程序员自定义函数 53<br /><br />4.4 过程抽象 54<br /><br />4.5 作用域和局部变量 55<br /><br />4.6 重载函数名称 55<br /><br />第5章 用函数完成所有子任务 56<br /><br />5.1 void函数 57<br /><br />5.2 传引用参数 57<br /><br />5.3 使用过程抽象 59<br /><br />5.4 测试和调试函数 59<br /><br />5.5 常规调试技术 59<br /><br />第6章 I/O流——对象和类入门 60<br /><br />6.1 流和基本文件I/O 60<br /><br />6.2 流I/O工具 61<br /><br />6.3 字符I/O 62<br /><br />第7章 数组 63<br /><br />7.1 数组入门 63<br /><br />7.2 函数中的数组 65<br /><br />7.3 数组编程 66<br /><br />7.4 多维数组 67<br /><br />第8章 字符串和向量 68<br /><br />8.1 字符串的数组类型 68<br /><br />8.2 标准string类 69<br /><br />8.3 向量 71<br /><br />第9章 指针和动态数组 71<br /><br />9.1 指针 71<br /><br />9.2 手工动态数组 74<br /><br />第10章 定义类 76<br /><br />10.1 结构体 77<br /><br />10.2 类 78<br /><br />10.3 抽象数据类型 81<br /><br />10.4 继承 82<br /><br />10.5 拷贝构造函数 83<br /><br />10.6 析构函数 84<br /><br />10.7 重载赋值(=)操作符 84<br /><br />第11章 友元函数、重载操作符和数组 86<br /><br />11.1 友元函数 87<br /><br />11.2 重载操作符 88<br /><br />11.3 数组和类 91<br /><br />11.4 类和动态数组 91<br /><br />第12章 独立编译和命名空间 92<br /><br />12.1 独立编译 92<br /><br />12.2 命名空间 93<br /><br />第13章 指针和链表 94<br /><br />第14章 递归 95<br /><br />第15章 继承 96<br /><br />15.1 继承基础 96<br /><br />15.2 继承细节 97<br /><br />15.3 多态性(虚函数) 98<br /><br />第16章 异常处理 100<br /><br />16.1 异常处理基础 100<br /><br />16.2 用于异常处理的编程技术 101<br /><br />第17章 模板 102<br /><br />17.1 用于算法抽象的模板 102<br /><br />17.2 用于数据抽象的模板 103<br /><br />第18章 标准模板STL) 104<br /><br />18.1 迭代器 104<br /><br />18.2 容器 105<br /><br />18.3 泛型算法 106<br /><br />18.4 不断进化的C++ 106<br /><br />第19章 Qt界面开发入门 106<br /><br />附录 107</p> <p style="margin: 0px; max-width: 100%; box-sizing: border-box; color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 14px; background-color: #ffffff;"> </p>
相关推荐
<p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言学习。本课程可以看做是嵌入式linux核心课程中《C语言专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制完成主体部分,总时长预计150小时左右。</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">朱老师C++第1部分-从C到C++</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">朱老师C++第2部分-C++和面向对象</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">朱老师C++第3部分-STL等和泛型</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">朱老师C++第4部分-C++编程优化和常见面试题</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">朱老师C++第5部分-Boost和设计模式</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;"> </p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">课程特色</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">*深入浅出,通俗易懂。不怕学不会,就怕你不学习。</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">*思路清晰、语言风趣,对着视频看也不会想睡觉······</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">*视频 + 文档 + 练习题 + 答疑相结合。</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。</p> <p style="font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', Arial, sans-serif; margin: 0px; padding: 0px; color: #313d54; font-size: 16px; background-color: #ffffff;">*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。</p>
C++标准函数中80%是STL,其中广泛使用了泛性编程思想,在其中分为几大部分。 1:语言支持部分。 2:诊断部分。包含了异常处理,断言,错误代码三大方式。 3:通用工具部分。包括动态内存管理工具,日期/时间处理工具等。 4:字符串处理部分。 5:国际化部分。使用Locale和facet可以为程序提供多国际化支持,包括各种字符集,日期时间,数值货币处理的支持。 6:容器(containers)部分。STL重要部分,包含了许多数据结构,有vector(动态增加的数组),queue(队列),stack(堆栈)……甚至也包括string,它也可以看做为一种容器,并且适用所有的容器可用的方法。 7:算法(algorithms)部分。STL重要部分,包含了70多个通用算法,都是优化的效率很高的,用来控制各种容器,内建数组等。例如find可以用来在容器中查找某特定值的元素,for_each可以用来将函数应用到容器元素之上,sort用于对容器中的元素排序。 8;迭代器(iterators)STL重要组成部分,每个容器都有自己的迭代器,只有容器才可以进行访问自己的元素,它类似指针,将算法和容器中的元素联系起来。 9:数值(numerics)部分。包含了一些数学运算的功能,对复数运算提供了支持。 10:输入输出(I/O)部分。摸版化的IOStream部分。他提供了对C++程序的支持,并且对原有的iostream兼容。 所以,总体看来,C++标准函数,包含的10大块内容中,STL主要包含了四个部分,迭代器,容器,算法。和额外的一个字符串。
第一篇 预备知识 第一章 c++编程技术 1.1 c++与c语言区别 2 1.1.1文件扩展名的改变 2 1.1.2简化输入/输出手段 3 1.1.3 数据类型声明的改变 3 1.1.4动态内存分配算符的使用 4 1.1.5 引用 (references) 类型 6 1.1.6 const语义的扩展 7 1.1.7 指针声明类型与对象类型相一致 10 1.1.8 int与char不再等价 11 1.1.9 结构数据类型的变化 11 1.1.10 数组和指针技术的不同 11 1.2 c++存储技术 12 1.2.1 c++存储类型 12 1.2.2 c++存取修饰符 14 1.2.3 c++对象的生存期 14 1.3 c++函数技术 16 1.3.1类的构造函数、析构函数与赋值函数 16 1.3.2 在派生类中实现类的基本函数 26 .1.3.3内联函数技术 27 1.3.4友元函数技术 28 1.4 c++面向对象机制实现 29 1.4.1 类的继承技术 29 1.4.2 函数重载技术 33 1.4.3运算符重载技术 34 1.4.4纯虚函数和抽象类技术 36 1.5 小结 37c++标准技术 2.1 c++标准简介 39 2.1.1 i/o流技术 41 2.1.2 string类 43 2.1.3 标准异常类 43 2.1.4 标准模板类 44 2.2 c++输入/输出流技术 45 2.2.1 c++语言输入/输出流概述 45 2.2.2输入输出格式控制 45 3.2.3特殊输入/输出流格式的设定 50 2.2.4自定义的流操作符 54 2.2.5 根本不用于标准流运算符间的流字符串读/写函数 56 2.2.6 标准输入/输出流的操作符的重载 57 2.2.7 c++文件输入/输出流 58 2.3 c++字符串技术 69 2.3.1字符串类基本操作 70 2.3.2 复杂字符串实例 83 2.4标准异常类 86 2.4.1 绝对终止机制 86 2.4.2 非局部goto机制 88 2.4.3 signals机制 89 2.4.4 c++异常处理机制 90 2.4.5 类的异常处理 92 2.5小结 94 第c++ stl技术原理和组成 第三章 stl技术原理 3.1 模板概述 96 3.1.1 smalltalk 方法 96 3.1.2 模板方法 97 3.1.3模板参数 98 3.1.4关键字typename的使用 99 3.2 函数模板 100 3.2.1 函数模板基础 100 3.2.2 函数的定制 102 3.2.3 函数模板实例 104 3.3类模板 107 3.3.1 类模板定义 107 3.3.2 类模板使用 110 3.3.3类模板中的友元 110 3.3.4模板程序设计举例 111 3.4 模板安全 114 3.4.1 class类型的参数 115 3.4.2 使得包容安全 116 3.4.3 默认构造函数 116 3.4.4 operator new 117 3.4.5 destructor 118 3.4.6 其他 118 3.5模板的特殊性 121 3.5.1一个特殊化的例子 121 3.5.2 指针特殊化 123 3.6 模板实例-list 容器类设计 124 3.7 小结 127 第四章 stl技术概述 4.1 stl简介 129 4.1.1 什么是stl 129 4.1.2 stl的发展 130 4.1.3 stl的使用和实现 131 4.1.4 名字空间技术 133 4.2 stl基本结构 134 4.2.1 容器(containers) 135 4.2.2 算法(algorithms) 139 4.2.3迭代器(iterators) 141 4.2.4 函数对象(function object) 145 4.2.5 其它部件 145 4.3 stl编程概述 146 4.3.1 传统c++编程技术 146 4.3.2 stl编程技术 148 4.4 stl头文件和编译器 152 4.5 stl编程关键 154 4.5.1 stl容器技术 154 4.5.2 c++stl技术 156 4.6 小结 161 第三篇 c++ stl容器编程技术 第五章 stl容器技术总述 5.1容器技术概述 163 5.1.1 容器介绍 167 5.1.2 forward 容器 167 5.1.3 reversible 容器 168 5.1.4 sequence 168 5.1.5
<p> <span style="color:#337FE5;"><strong>【为什么还需要学习C++?】</strong></span> </p> <p style="margin-left:0cm;"> 你是否接触很多语言,但从来没有了解过编程语言的本质? </p> <p style="margin-left:0cm;text-align:start;"> 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? </p> <p style="margin-left:0cm;text-align:start;"> 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? </p> <p style="margin-left:0cm;text-align:start;">   </p> <p style="margin-left:0cm;text-align:start;"> 那么C++就是你个人能力提升,职业之路进阶的不之选。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;"> <strong><span style="color:#337FE5;">【课程特色】</span></strong> </p> <p style="margin-left:0cm;text-align:start;"> 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准全部知识体系。 </p> <p style="margin-left:0cm;text-align:start;"> 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 </p> <p style="margin-left:0cm;text-align:start;"> 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p class="ql-long-24357476"> <span style="color:#337FE5;"><strong>【学完后我将达到什么水平?】</strong></span> </p> <p class="ql-long-24357476"> 1.对C++的各个知识能够熟练配置、开发、部署; </p> <p class="ql-long-24357476"> 2.吊打一切关于C++的笔试面试题; </p> <p class="ql-long-24357476"> 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 </p> <p class="MsoNoSpacing" style="margin-left:18pt;"> <br /> </p> <div> <br /> </div> <p> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#337FE5;"><strong>【面向人群】</strong></span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">1.希望一站式快速入门C++初学者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">2.希望快速学习 C++、掌握编程要义、修炼内功的开发者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">3.有志于挑战更高级的开发项目,成为资深开发的工程师。</span> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p> <br /> </p> <p> <span style="color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> 本课程包含3大模块 </p> <p> <strong>基础篇</strong><br /> 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 </p> <p> <br /> <strong>进阶篇</strong><br /> 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 </p> <p> <br /> <strong>提升篇:</strong><br /> 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。 </p> <p> <img src="https://img-bss.csdnimg.cn/202007091130239667.png" alt="" /> </p>
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值