《C++ Primer》读书笔记—第十六章 模板与泛型编程

---恢复内容开始---

声明:

  • 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
  • 学习一门程序设计语言最好的方法就是练习编程

1、面向对象编程和泛型编程都是处理在编写程序时不知道类型的情况,不同之处在于,OOP能处理类型在程序运行之前都未知的情况,而在泛型编程中,在编译时就能获知类型了。

2、泛型编程与面向对象编程一样,都依赖于某种形式的多态性。面向对象编程中的多态性在运行时应用于存在继承关系的类。

3、在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译时不相关的类型。一个类或一个函数可以用来操纵多种类型的对象。标准库中的容器、迭代器和算法是很好的泛型编程的例子。标准库用独立于类型的方式定义每个容器、迭代器和算法,因此几乎可以在任意类型上使用标准库的类和函数。

一、定义模板

1、重载函数:

 1 int compare(const string &v1,const string &v2)
 2 {
 3     if (v1 < v2)
 4     {
 5         return -1;
 6     }
 7     else if (v1 > v2)
 8     {
 9         return 1;
10     }
11
12     return 0;
13 }
14
15 int compare(const double &v1,const double &v2)
16 {
17     if (v1 < v2)
18     {
19         return -1;
20     }
21     else if (v1 > v2)
22     {
23         return 1;
24     }
25
26     return 0;
27 }  

唯一差异是参数的类型不同,函数体一样。

定义函数模板:。函数模板是一个独立于类型的函数,可以作为一种方式,产生函数的特定类型版本。

 1 template<typename T>
 2 int compare(const T &v1,const T &v2)
 3 {
 4     if (v1 < v2)
 5     {
 6         return -1;
 7     }
 8     else if (v1 > v2)
 9     {
10         return 1;
11     }
12
13     return 0;
14 }  

模板定义以关键字template开始,后跟一个模板参数列表。这是一个逗号分隔的一个或多个模板参数(template parameter)的列表,用<>包围。模板列表不能为空

2、

3、

二、模板实参推断

1、

2、

3、

三、重载与模板

1、

2、

3、

四、可变参数模板

1、

2、

3、

五、模板特例化

1、

2、

3、

---恢复内容结束---

时间: 2024-12-24 22:03:42

《C++ Primer》读书笔记—第十六章 模板与泛型编程的相关文章

第十六章 模板与泛型编程

16.1 知识点:当我们调用一个模板函数时,即向一个模板传递实参,编译器用此函数实参来推断模板实参,并将该模板实参(即实参的类型)绑定到模板参数(即T). 实例化:编译器用模板实参代替对应的模板参数来创建出一个新"实例".譬如用int代替T,创建出一个新函数实例. 16.2 template <typename T> bool cmp(const T &a, const T &b) { return a < b; } int main() { cout

c++ primer 5th 笔记:第六章

第六章 笔记 1. 通过调用运算符(call operator)来执行函数.调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是一个函数或指向函数的指针. 2. 在c++语言中,名字有作用域,对象有生命周期. a. 名字的作用域是程序文本的一部分,名字在其中可见. b. 对象的生命周期是程序执行过程中该对象存在的一段时间. 3. 函数体是一个语句块,块构成一个新的作用域. 4. 形参和函数体内部定义的变量统称为局部变量(local variable). 5. 局部静态对象(local s

C primer plus 读书笔记第十四章

这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点. 1.示例代码 /*book.c -- 仅包含一本书的图书目录*/ #include <stdio.h> #define MAXTITL 41 #define MAXAUTL 31 struct book { /* data */ char title[MAXTITL]; char author[MAXAUTL]; float value; }; int main(void) { struct book library; /

C primer plus 读书笔记第十二章

C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的定义:作用域.链接以及存储时间.其他编程语言也有类似的概念.C语言通过这三个概念定义了5中存储类.其说明符分别为auto.register.static.extern和typedef. 2.存储类和函数 函数也分为外部的和静态的.关键字是extern和static.默认情况下是外部的. 3.mall

C++ Primer 读书笔记:第11章 泛型算法

第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数. 2.常用的泛型算法函数: fill,fill_n, copy, replace, sort, unique, count_if, stable_sort 此外在有一个谓词函数会结合以上的函数使用,像sort, count_if等 3.再谈迭代器 (1)插入迭代器 back_inserter, f

C++ Primer 读书笔记: 第8章 标准IO库

第8章 标准IO库 8.1 面向对象的标准库 1. IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中的string对象.在fstream和sstream里定义的美中类型都是从iostream头文件中定义的相关类型派生而来. 2. 流对象不能复制,因此不能存储在vector容器中 3. 形参或返回类型也不能为流类型.如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用.

《APUE》读书笔记第十二章-线程控制

本章中,主要是介绍控制线程行为方面的内容,同时介绍了在同一进程中的多个线程之间如何保持数据的私有性以及基于进程的系统调用如何与线程进行交互. 一.线程属性 我们在创建线程的时候可以通过修改pthread_attr_t结构的值来修改线程的属性,将这些属性与创建的线程联系起来.调用pthread_attr_init以后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性. #include <pthread.h> int pthread_attr_init(pthrea

《Programming in Lua 3》读书笔记(二十六)

日期:2014.8.12 PartⅣ The C API 30 Managing Resources 上一节中实现的自定义类型,我们并没有关注于资源管理的问题.上一节实现的数组是需要关心内存问题,而这些问题由Lua实现管理.但是很多时候事情不那么简单,有些对象不仅需要内存空间,还会需要如窗口句柄.文件描述等资源.尽管说这些也是内存开销,但是这些资源是由系统的其他组件管理的.这种情况下,当一个对象被回收了,我们也需要合适的机制来实现回收这些额外的资源. 在17.6章节中,介绍了Lua提供的fina

Javascript高级程序设计读书笔记(第六章)

第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新对象. 构造函数的问题:每个方法都要在每个实例上重新创建一遍: 理解原型对象: 无论何时,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象.默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性包含一个指向proto