C++之STL
5.子类模板访问基类模板
在子类模板中访问那些在基类模板中声明且依赖于模板参数的符号,应该在它前面加上作用域限定符"::" 或者显示使用this指针
否则,编译器将试图在全局域中寻找该符号,引发错误。
参见:inherit.h
6.模板型模板参数
类模板的模板参数如果结合的实参不是具体类型而是另一个模板,那么不能使用typename关键字声明该参数,而是写明其所结合的类模板实参的原型:
template<模板形参表> class 模板型模板参数名
参见ta.cpp
对于函数模板,GNU编译器允许为其传递模板型模板参数,但是从C++标准并不支持。
7.嵌套模板的外部定义
如果将嵌套于一个类模板的内部模板放到包装模板的外部定义,需要按照作用域层次的顺序,从外到内,从前到后一次使用独立template字句声明其模板参数表
8.“零”初始化
基本类型不存在缺省构造函数,所以未被显示初始化的局部变量和成员变量具有一个未定义的初值。如果希望模板函数或者模板类中所有参数花类型的变量,无论是基本类型还是类类型,都能以缺省方式被初始化,就必须显示进行缺省构造(写出构造函数),即“零”初始化。
T var = T(); //局部变量
...:m_var()...//成员变量
参见:init.cpp
9.虚函数和多态
(1)类模板中可以声明虚函数,而且只要实例化该模板时所提供的类型实参不违背虚函数有效覆盖的条件,就可以形成多态
(2)由于模板函数的延迟编译要晚于类或者类模板中虚表的构建,因此模板函数不能同时又是虚函数
参见vf.cpp
列出不能被声明为虚函数的函数:
全局函数,静态成员函数,构造函数,模板型成员函数
四 、编译模型
1.单一模型:将函数,类和模板的声明,实现和使用放在同一
声明
实现
使用
优点:一目了然,构建方便
缺点:难以维护,难以复用,不利于协作开发
2.分离模型:将函数、类和模板的声明、实现和使用分别放在不同的源代码文件中
优点:易于维护,易于复用,便于协作开发
缺点:需要编写专门的构建脚本————makefile
致命:编译模板实现代码时,编译器看不到对模板的使用,因此所生成的目标模块中没有关于该模板的二进制指令,
最终导致链接失败
参见:div/
3.包含模型:在模板声明文件的尾部包含模板实现文件,保证所有使用该模板的代码在头肩扩展以后都实际包含了该模板的声明和使用,保证延迟编译的顺利进行,链接成功。
优点:解决了分离模型的致命问题——链接失败
缺点:模板的实现代码必须公开,延长编译时间。
参见:inc/
4.实例模型:在模板的实现中包含对该模板的显示实例化代码,旨在迫使编译器在看到对模板使用之前,提前二次编译,
保证链接通过。
优点:模板的实现代码不必公开,编译时间不受影响
缺点:实例化类型有限,无法实现绝对通用。
5.导出模型:通过export关键字将模板声明导出,编译器会将该模板一次编译之后形成的内部表示缓存到其目标文件(.o)中
在链接阶段结合使用该模板的代码所提供的类型实参,完成二次编译
优点:代码分离、实现不公开、编译速度快,类型通用。
缺点:绝大多数编译器并不支持该模型。
GNU / MIicrosoft / IBM / Oralce / HP 都不支持
C++2011 / 2014 / 2017 已经废弃此模型。export关键字已经被挪作他用。
五、容器、迭代器和泛型算法
容器:基于类模板语法实现泛型数据结构
泛型算法:基于函数模板语法实现泛型常用算法。
迭代器:基于指针语法实现面向不同容器的同一访问方式。
双向线性链表容器:
正向顺序可写迭代器:
线性查找算法:
体现的算法======>工具 是给别人用的,好用,方便,接口,简单易用并且高效
如果一个类中含有 指针成员,并且指向的是动态分配的内存,这个时候往往需要自己给出 支持深拷贝的构造构造和拷贝赋值操作符函数
C++之STL的更多相关文章
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- STL的std::find和std::find_if
std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...
- STL: unordered_map 自定义键值使用
使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...
- C++ STL简述
前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
- STL sort 函数实现详解
作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...
- STL的使用
Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
随机推荐
- Scalaz(45)- concurrency :Task-函数式多线程编程核心配件
我们在上一节讨论了scalaz Future,我们说它是一个不完善的类型,最起码没有完整的异常处理机制,只能用在构建类库之类的内部环境.如果scalaz在Future类定义中增加异常处理工具的话,用户 ...
- Atitit.提升语言可读性原理与实践
Atitit.提升语言可读性原理与实践 表1-1 语言评价标准和影响它们的语言特性1 1.3.1.2 正交性2 1.3.2.2 对抽象的支持3 1.3.2.3 表达性3 .6 语言设计中的权 ...
- GJM : Unity3D - NetWork - Hight Level API ( HLAPI) [转载]
介绍在本系列教程中,我们将使用的网络高级API(HLAPI)来构建一个小型的多人网络案例.即使我们的例子很简单,但也会涵盖以下关键概念,这应该可以帮助大家使用HLAPI构建大型游戏项目. 在第一部分, ...
- SequenceInputStream
SequenceInputStream从名字上看, 他是一个序列字节输入流 既然是个序列 那么意味着 SequenceInputStream装着许多的输入流 所以 可以用他来合并文件 Sequence ...
- telnetlib/SNMP
telnetlib telnetlib 总体来讲还是很好理解的,因为已经耍过paramiko 关于 .read_very_eager(), 简单理解就是就是读尽量多,读到没有反馈了为止 关键功能 1) ...
- 一款开源且功能强大的C#甘特图控件.NET Winforms Gantt Chart Control
甘特图在项目管理中非常重要,甘特图的思想比较简单,即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间.它直观地表明任务计划在什么时候进行,及实际进展与计划要求的对比.管理 ...
- Ocrad.js – JS 实现 OCR 光学字符识别
Ocrad.js 相当于是 Ocrad 项目的纯 JavaScript 版本,使用 Emscripten 自动转换.这是一个简单的 OCR (光学字符识别)程序,可以扫描图像中的文字回文本. 不像 G ...
- FROONT – 超棒的可视化响应式网页设计工具
FROONT 是一个基于 Web 的设计工具,在浏览器中运行,使得各类可视化设计的人员都能进行响应式的网页设计,即使是那些没有任何编码技能的设计师.FROONT 使得响应式网页设计能够可视化操作,能够 ...
- [js开源组件开发]loading加载效果
loading加载效果 由于程序和网络的原因,常常我们需要在交互的时候,给用户一个正在加载中的动画,于是,loading组件横空出世.不需要复杂的代码,也能完成大多数业务,这就是我做组件的原则. 效果 ...
- Sublime Text3 支持Less
1.安装Sublime 插件 (1)安装LESS插件:因为Sublime不支持Less语法高亮,所以,先安装这个插件,方法: ctrl+shift+p>install Package>输入 ...