chap1 C++泛型技术基础--模板 #STL
0 缘起
- 有一点编程经验和积累,想系统的学习下STL,以前都是随意做的笔记,现在想着成主题的输出一下。
- 书的原型是ISBN:9787302421757 《C++泛型STL原理和应用》,是从图书馆借的国内大学教材,先把这个读完了,如果有可能的话,就在相应的章节再写一个plus版本。
1 内容
1.1 泛型和模板
1.1.1 泛型的概念
- 泛型(generic type):就是一种通用类型。
T max( T x, T y) {}
//这里T是类型占位符。
1.1.2 C++模板及其定义
- 模板:除了需要声明类型占位符之外,其它内容应与目标实体代码完全相同。 声明一个模板时,需在实体代码前面,加一条说明语句。前面是template关键字。
- 函数模板
template<typename T, typename R, typename S> T max(R x, S y){}
- 类模板
- 在声明语句前加
template<typename T>
- 在声明语句前加
- 函数模板
1.1.3 几点说明和小结
template<typename T>
早期也写成template<class T>
,但不支持这么写- C++11和14中,给关键字 auto 增加了新的语义,同时增加了 decltype表达式
- auto关键字是为自动推导数据类型所设
auto i=100;
- 之前auto只对系统的内置数据推荐有效,现在利用编译器的类型记忆能力,可以记住自定义的类型。
- 变量类型难以确定的问题主要出现在函数的返回值上,因此函数的返回值类型的位置常常会出现auto关键字,称为 auto返回值占位
auto Multiply(T t, U u)->decltype(t*u) {return t*u;}
- auto关键字是为自动推导数据类型所设
- 把auto看做数据类型的话,auto其实也可以算一种泛型,不过它无须关键字typename声明。
- C++新标准引入了变量模板的概念。
pi<T>
【作者没有介绍更多,可以翻看C++11】
1.2 关于模板参数
1.2.1 模板参数的种类
- 类型参数
- 以类模板作为函数实参的例子
MyTest<Test1<int>>TT;
- 以类模板作为函数实参的例子
- 非类型参数
template <typename T,/*类型参数*/ int b/*非类型参数*/>
- 模板定义型参数
- C++也允许以类模板的定义作为类模板参数
- 需要的目的: 除了强调这个参数的实参必须为类模板之外,还强调这个类模板所具有的参数个数。
- C++也允许以类模板的定义作为类模板参数
1.2.2 模板形参和实参的结合
- 函数模板实参的隐式提供
add<int>(45,46);
直接变成add(45,46);
- 指针实参
- 在C++中,指针被看作一种数据类型。
- 见具体的代码; 【作者没有描述,我还没太懂这部分】
- 修饰字const和&的使用
- 见具体的代码示例; 【没见过具体的应用场景】
1.3 特化模板和模板具现规则
1.3.1 特化(特列化)模板
- 特化(特列化)模板:为有特殊算法要求的数据类型另行编写模板
- 通用模板:门票10块
- 特化模板:学生和老人半价
- 函数模板中的特化模板
- 在实体代码前加以下声明
tmplate<>
- 在实体代码前加以下声明
- 类模板的特化和偏特化
- 偏特化:只特化参数中的某一个或某几个
- 偏特化模板的写法
template<typename T2> struct Test<int,T2>{}
- 全特化模板的写法
template<> struct Test<int,float>{}
1.3.2 模板的具现
- 因为有了以上泛型模块的共存,编译器就需要选择一个生成实体模块代码,就有了规则。
- 具体的优先顺序
- 特化模板(函数或类)
- 偏特化模板(函数或类)
- 普通模板(函数或类)
- 系统
1.4 右值引用和模板
转移语义是C11推出的新概念和新技术。
1.4.1 右值引用
- 右值: 只能出现在赋值运算符右边。仅能代表数据;匿名,无固定地址的对象。
- 左值: 既可以出现在赋值运算符左边,又可以出现在赋值运算符右边。有名字,有固定地址的表达式
- 右值引用
- C11之前有两种表示方式
T& 别名 = lvalue;//引用
和const T& 别名 = lvalue;//常引用
- C11之后仅定义一种:
const T& 别名 = rvalue;
- 强行为右值命名一个变量名,目的就是为延长右值生命期。
- 右值的非常量引用
T&& 名称=rvalue;
- C11之前有两种表示方式
1.4.2 右值引用的应用1--转移语义
- 深拷贝
- 浅拷贝
1.4.3 右值引用的应用2--转移函数move()
- 右值引用有好处后,左值也想利用,move的原型
T&& move(T& val);
1.4.4 右值引用的应用3--参数完美转发模板()
- 参数转发
- 1 完美转发问题的提出及解决思路
- 2 模板参数类型推导规则--引用符折叠规则
- 3 参数类型正确转发的保证--forward()函数模板
static_cast()
:这个转换只对参数为右值时有用。- C++11将
static_cast()
封装成函数模板std::forward,于是Func(forwad<T>(a));
本章代码
阅读版本与遇到的问题
- 2017-01-14两个番茄钟:1.1节理解并代码完成,1.2节刚开始看
- C++新标准引入了变量模板的概念。
pi<T>
【作者没有介绍更多,可以翻看C++11】 - 以类模板作为函数实参的例子,简单的能看懂,但到真实应用场景中,目前还真说不好。
- C++新标准引入了变量模板的概念。
- 2017-01-15两个番茄钟:1.2和1.3节理解并代码完成
- 目前这些只是知道了,还没完全记住,更不清楚应用场景。
- 2017-01-16两个番茄钟:1.4结束
- 这部分只是按课本看了,并没有完全消化掉,需要再回来看看。
- 是不是得结合C++11来一起翻看?【lionel】
别的教材相应章节
chap1 C++泛型技术基础--模板 #STL的更多相关文章
- 第1章:C++泛型技术基础:模板——《C++泛型:STL原理和应用》读书笔记整理
第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数 typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体 ...
- 《C#语言和数据库技术基础》单词必备
<C#语言和数据库技术基础> 第一章1..NET Framework 框架2.sharp 尖锐,强烈的3.application 应用程序4.devel ...
- new 经典基础模板总结
NOIP-NOI-ZJOI基础模板总结 目录 C++语言和STL库操作 重载运算符操作 /* 重载运算符 格式 如重载小于号 这里是以x递减为第一关键字比较,y递减为第二关键字比较 */ bool o ...
- docker容器技术基础入门
目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...
- JNI技术基础(2)——从零开始编写JNI代码
书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...
- AOP技术基础
1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
- ajax技术基础详解
一.概述 1.什么是ajax 可以与服务器进行[异步]交互的技术,浏览器无需刷新 2.什么时候出现ajax? -- XMLHttp 微软 1999年微软公司发布IE5版本,内嵌了ajax技术 什么时候 ...
- AOP技术基础(转)
1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...
随机推荐
- GridView使用技巧
http://yushuir.blog.163.com/blog/static/4346713820081023103937681/
- 登陆页面改为SSO验证
登陆页面改为SSO验证 单点登录(SSO,single sign-on)是一个会话或用户身份验证过程,用户只需要登录一次就可以访问所有相互信任的应用系统,二次登录时无需重新输入用户名和密码.简化账号登 ...
- HTTP/1.1与HTTP/1.0的区别
HTTP/1.1与HTTP/1.0的区别 下面主要从几个不同的方面介绍HTTP/1.0与HTTP/1.1之间的差别,当然,更多的内容是放在解释这种差异背后的机制上. 1 可扩展性 可扩展性的一个重要原 ...
- 存储过程的参数问题与C#中的调用
1. 带参数的存储过程 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[sp_select_gua] @num ...
- RikMigrations 或 Migrator.NET 进行自动化的数据库升级
一种版本化的数据库脚本管理机制 现今开发的软件当中,多数系统的数据都是基于数据库存储的,但是由于软件变化的复杂性,相对于维护代码,数据库架构的版本并不是那么好维护. 这里本人针对实际情况,理想化出一种 ...
- BT是如何下载的
BT协议简介 一.BT下载是怎么来的? 在互联网上下载文件的方式大概有这么几种:FTP.HTTP.BT.eMule(电驴)等, 浏览器会直接支持FTP和HTTP下载,BT和eMule下载一般需要专用的 ...
- Castle.DynamicProxy Part 1: ClassProxy
1.Castle中代理对象的分类 总的来说,代理对象大概可以分为2大类: 1.继承类型的代理对象 一类是继承类型的代理类.即:有一个类A,它的代理类是B.B是继承自A的.调用代理类B中的方法时,可以通 ...
- 在win下,如何用bat看程序运行的时间
上网搜了下用bat记录程序运行时间的方法,结果连google跳出的都是些什么ctime啥的- - 一点都不靠谱 傍晚问了几个大神,也大多都是ctime党,不过还好明哲造![跪跪跪] 在此mark 就比 ...
- 10-18 noip提高组模拟赛(codecomb)T2贪心
T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...
- ngx-push-stream模块源码学习(一)——序言
一.概述 与传统的request-response的web应用模式不同,comet是一种长连接(long-held)的应用模式,从而允许服务端主动向客户端推送数据. 主流的comet技 ...