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其实也可以算一种泛型,不过它无须关键字typename声明。
  • C++新标准引入了变量模板的概念。pi<T> 【作者没有介绍更多,可以翻看C++11】

1.2 关于模板参数

1.2.1 模板参数的种类

  • 类型参数

    • 以类模板作为函数实参的例子 MyTest<Test1<int>>TT;
  • 非类型参数
    • template <typename T,/*类型参数*/ int b/*非类型参数*/>
  • 模板定义型参数
    • 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;

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】
    • 以类模板作为函数实参的例子,简单的能看懂,但到真实应用场景中,目前还真说不好。
  • 2017-01-15两个番茄钟:1.2和1.3节理解并代码完成
    • 目前这些只是知道了,还没完全记住,更不清楚应用场景。
  • 2017-01-16两个番茄钟:1.4结束
    • 这部分只是按课本看了,并没有完全消化掉,需要再回来看看。
    • 是不是得结合C++11来一起翻看?【lionel】

别的教材相应章节

chap1 C++泛型技术基础--模板 #STL的更多相关文章

  1. 第1章:C++泛型技术基础:模板——《C++泛型:STL原理和应用》读书笔记整理

    第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数   typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体 ...

  2. 《C#语言和数据库技术基础》单词必备

    <C#语言和数据库技术基础> 第一章1..NET Framework   框架2.sharp            尖锐,强烈的3.application      应用程序4.devel ...

  3. new 经典基础模板总结

    NOIP-NOI-ZJOI基础模板总结 目录 C++语言和STL库操作 重载运算符操作 /* 重载运算符 格式 如重载小于号 这里是以x递减为第一关键字比较,y递减为第二关键字比较 */ bool o ...

  4. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  5. JNI技术基础(2)——从零开始编写JNI代码

    书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...

  6. AOP技术基础

    1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...

  7. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  8. ajax技术基础详解

    一.概述 1.什么是ajax 可以与服务器进行[异步]交互的技术,浏览器无需刷新 2.什么时候出现ajax? -- XMLHttp 微软 1999年微软公司发布IE5版本,内嵌了ajax技术 什么时候 ...

  9. AOP技术基础(转)

    1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...

随机推荐

  1. DbUtility Ex

    扩展 DbUtility (1) 2014-05-22 21:48 by Ivony..., 234 阅读, 3 评论, 收藏, 编辑 本文原始路径: https://www.zybuluo.com/ ...

  2. ASP.NET WebApi 开放数据

    概述 开放式数据协议(OData) 是用于在 web 数据访问协议.它提供统一的方式来构造数据. 查询的数据和操纵数据集通过 CRUD 操作.它支持 AtomPub (XML) 和 JSON 格式.它 ...

  3. Java、C#双语版HttpHelper类

    Java.C#双语版HttpHelper类(解决网页抓取乱码问题)   在做一些需要抓取网页的项目时,经常性的遇到乱码问题.最省事的做法是去需要抓取的网站看看具体是什么编码,然后采用正确的编码进行解码 ...

  4. IOS UI 第一篇:基本UI

    1. UI 书写 最基本创建一个label 标签 写一个first rate :      UILabel *label = [[UILabel alloc] initWithFrame:CGRect ...

  5. 优秀Python学习资源

    优秀Python学习资源收集汇总(强烈推荐)   Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮 ...

  6. SQLSERVER一些公用DLL

    SQLSERVER一些公用DLL的作用解释   SQLSERVER一些公用DLL的作用解释 如果你的SQLSERVER安装在C盘的话,下面的路径就是相应SQLSERVER版本的公用DLL的存放路径 S ...

  7. 算法打基础——HashⅡ: 全域哈希与完美哈希

    这一节涉及数学超级多,各种数论知识,各种不明觉厉! 看了几遍,才勉强看懂一些,所以这 篇稍微简单的介绍着两种hash table, 免得瞎说说错了. 这一讲的主要知识点是:1. 全域哈希及构造     ...

  8. 反射实现IOC功能

    通过反射实现IOC功能   这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET ...

  9. dmp文件导入的方法

    1,使用oracle的imp命令导入*.dmp文件 首先要明确知道,使用oracle的imp命令进行导入,要在一个空的数据库下,才是最好的,否则,数据表存在的话,就要先删除数据表中的数据 步骤1:禁用 ...

  10. .NET PageAdmin CMS

    .NET PageAdmin CMS 完全破解步骤(非简单去版权) 其实当初我的目的是很纯洁的,只是想找一个简单的网站生成模板,由于对.net更熟悉一点,就去搜索了.net框架的CMS,看它的介绍挺强 ...