【Draco徐C++学习心得】模板与基础数据结构【初阶】.docx

【Draco徐C++学习心得】模板与基础数据结构【初阶】.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
应大家的强烈要求,今天专写模板和基础数据结构的设计。模板?模板应该是C++里面篇幅最少的东西了。模板,顾名思义,就是模板0 0费尽心机的重载,不如一个模板来的痛快。模板的使用:模板带来的便利不仅仅是函数上的。学C++多少会对STL有所了解。STL的全称是Standard Template Library,标准模板库。做COM的ATL全称是Active Template Library,活动模板库。由此可见模板的应用是多么广泛。但是小徐先跟大家说一个前提:不论是模板类还是模板函数,它们的实现最好放在一起。也就是说,在.h文件中声明的模板,最好不要在.cpp中实现,而是将实现代码一并放入.h文件中,最后在.h文件的开头加上#pragma once编译指令。你们可能说了,这样.h不会变的臃肿了么。小徐也没办法,对于模板的支持每款编译器都不一样,而且越老的编译器对模板的支持就越差,小徐也是因为这个原因舍弃了VC6的编译器,换成VS2008。见过很多解决这种方法的案例,一般是在.h文件中写入声明,将实现写在.inl文件中,然后在.h文件的末尾加入#include XXX.inl模板类的使用大家可以参照STL的实现代码,因为STL本身就是个非常好的例子。小徐也没法说的太详细,因为模板这东西本来就很浅,但是用的好会非常犀利。模板的特例?还是拿上面的add函数举例子。如果我传入的参数是char *,即两个字符串,让两个字符串相加,即首尾相连的话,我们就不能单纯的用数值相加来操作了,因为传进来的是两个地址,而且字符串连接需要一些特殊的代码,于是我们:可以看到上图在使用特例化后的模板类和模板函数的时候,模板的参数表不能少,是几个还是要传入几个。额,恩,还有,在模板列表中class和typename是一样的。模板特例化有一个非常有意思的应用是编译时类型特征的提取:这段代码来自lua_tinker.h,是目前很流行的对Lua进行C API封装的代码。对lua感兴趣的同学可以到网上下载,只有两个文件,lua_tinker.h和lua_tinker.cpp。讲解的不要,自己琢磨琢磨。----------------------------------------我-是-分-割-线---------------------------------------数据结构?当你认为本次日志的重头戏来了的时候,你就错啦。不瞒你们说,小徐去年考数据结构是靠抄的。所以本着考试心情的童鞋可以就此打住了。小徐只能讲讲数据结构的一些常用的结构和使用方法,如何设计等等。复杂度神马的不会,查找效率神马的没有,要看公式的也可以就此打住了。数据结构最最最最最简单的结构是线性表。何为线性表?就是数组啦。忽视忽视。用得最多扩展最多的是链表结构:数据结构是一种动态的结构,可以动态的插入或删除数据,没有数组这种结构的容量上限。所以结点之间手拉手是最好的选择啦。前一个结点的pnext指针成员指向了下一个结点的地址,这句话应该很好理解吧。好比同学们站好队,我从队伍最后面看只能看到一个人:我只能看到D。但是我想找A,显然D也看不到A,于是D问C能看到么,C也看不到;于是C再问B,然后B说A就在我前面啊。D被称为首结点,一般情况下我们只需要记住首结点就可以了。每个数据结构中都充斥了这种指向型的结构。比如树也是,哈希表也是,图也是。所以理解不了这种指向的概念,就没有办法继续向下学习。数据结构的效率?效率分为两个方面:插入效率和查找效率。插入效率最高的莫过于链表,因为我只要让新的结点指向首结点,然后让这个新的结点变成首结点就可以了。但是查找效率就很低了。就像上面说的,我想找到A,必须要从D一路问过去。而树这种结构就相对便捷一些:这样我从D开始,通过某种约定在C和B之中选择了B,然后再找到了A。这样不就更快捷了么?这是查找效率的提升。但是因为这种提升,插入效率就变了慢了一些。如果我们要插入一个E:从D开始,通过某种约定选择B,然后再通过某种约定确定E应该作为B的左子结点被插入。这显然就比链表的插入要慢一些了。所谓某种约定,是我们自己定义的,最常见的约定是二叉树的左子节点比右子节点小:对于数据结构来说,最快的插入和查找效率应该是即时插入和查找,就像数组一样,只需要对指针进行偏移就可以了,比如:int a[10000]={...};我们要找第9999个数据,只需要:a[9999];就可以了。那么在数据结构中我们可不可以实现这种查找非常快捷的方式呢?答案是可以的,就是哈希表。哈希表可以被认为是一个定长的线性空间,就像一个数组一样。它存储的数据包括两个部分,即:键和值,就像我要找到小明的户籍资料,只需要向户籍库提供“小明”这个名字key,然后库就能返回资料这个value一样。“小明”这个名字作为一个key,需要

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档