C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念
- 编写不依赖于具体数据类型的程序
- 将算法从特定的数据结构中抽象出来,成为通用的
- C++的模板为泛型程序设计奠定了关键的基础
术语:概念
- 用来界定具备一定功能的数据类型。例如:
- 将“可以比大小的所有数据类型(有比较运算符)”这一概念记为Comparable
- 将“具有公有的复制构造函数并可以用‘=’赋值的数据类型”这一概念记为Assignable
- 将“可以比大小、具有公有的复制构造函数并可以用‘=’赋值的所有数据类型”这个概念记作Sortable
- 对于两个不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能,那么就说概念B是概念A的子概念。例如:
- Sortable既是Comparable的子概念,也是Assignable的子概念
术语:模型
- 模型(model):符合一个概念的数据类型称为该概念的模型,例如:
- int型是Comparable概念的模型。
- 静态数组类型不是Assignable概念的模型(无法用“=”给整个静态数组赋值)
用概念做模板参数名
- 很多STL的实现代码就是使用概念来命名模板参数的。
- 为概念赋予一个名称,并使用该名称作为模板参数名。
例如
表示insertionSort这样一个函数模板的原型:
template <class Sortable>
void insertionSort(Sortable a[], int n);
STL简介
标准模板库(Standard Template Library,简称STL)提供了一些非常常用的数据结构和算法
STL简介
- 标准模板库(Standard Template Library,简称STL)定义了一套概念体系,为泛型程序设计提供了逻辑基础
- STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的。
- 使用STL的模板时,类型参数既可以是C++标准库中已有的类型,也可以是自定义的类型——只要这些类型是所要求概念的模型。
STL的基本组件
- 容器(container)
- 迭代器(iterator)
- 函数对象(function object)
- 算法(algorithms)
STL的基本组件间的关系
- Iterators(迭代器)是算法和容器的桥梁。
- 将迭代器作为算法的参数、通过迭代器来访问容器而不是把容器直接作为算法的参数。
- 将函数对象作为算法的参数而不是将函数所执行的运算作为算法的一部分。
- 使用STL中提供的或自定义的迭代器和函数对象,配合STL的算法,可以组合出各种各样的功能。

STL的基本组件——容器(container)
- 容纳、包含一组元素的对象。
- 基本容器类模板
- 顺序容器
- array(数组)、vector(向量)、deque(双端队列)、forward_list(单链表)、list(列表)
- (有序)关联容器
- set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
- 无序关联容器
- unorderedset (无序集合)、unorderedmultiset(无序多重集合)
- unorderedmap(无序映射)、unordermultimap(无序多重映射)
- 顺序容器
- 容器适配器
- stack(栈)、queue(队列)、priority_queue(优先队列)
- 使用容器,需要包含对应的头文件
STL的基本组件——迭代器(iterator)
- 迭代器是泛化的指针,提供了顺序访问容器中每个元素的方法
- 提供了顺序访问容器中每个元素的方法;
- 可以使用“++”运算符来获得指向下一个元素的迭代器;
- 可以使用“*”运算符访问一个迭代器所指向的元素,如果元素类型是类或结构体,还可以使用“->”运算符直接访问该元素的一个成员;
- 有些迭代器还支持通过“--”运算符获得指向上一个元素的迭代器;
- 迭代器是泛化的指针:指针也具有同样的特性,因此指针本身就是一种迭代器;
- 使用独立于STL容器的迭代器,需要包含头文件。
STL的基本组件——函数对象(function object)
- 一个行为类似函数的对象,对它可以像调用函数一样调用。
- 函数对象是泛化的函数:任何普通的函数和任何重载了“()” 运算符的类的对象都可以作为函数对象使用
- 使用STL的函数对象,需要包含头文件
STL的基本组件——算法(algorithms)
- STL包括70多个算法
- 例如:排序算法,消除算法,计数算法,比较算法,变换算法,置换算法和容器管理等
- 可以广泛用于不同的对象和内置的数据类型。
- 使用STL的算法,需要包含头文件。
- 例10-1从标准输入读入几个整数,存入向量容器,输出它们的相反数
STL程序实例
transform算法的一种实现:
template <class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op) {
for (;first != last; ++first, ++result)
*result = op(*first);
return result;
}
- transform算法顺序遍历first和last两个迭代器所指向的元素;
- 将每个元素的值作为函数对象op的参数;
- 将op的返回值通过迭代器result顺序输出;
- 遍历完成后result迭代器指向的是输出的最后一个元素的下一个位置,transform会将该迭代器返回
本文内容参考自C++语言程序设计(第4版),郑莉,清华大学出版社
C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构的更多相关文章
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
- 第1章:C++泛型技术基础:模板——《C++泛型:STL原理和应用》读书笔记整理
第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数 typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体 ...
- C++STL模板库适配器之优先级队列
目录 适配器之优先级队列 一丶优先级队列简介(priority_queue) 二丶优先级队列代码演示 1.优先级队列代码以及使用简介 适配器之优先级队列 一丶优先级队列简介(priority_queu ...
- C++STL模板库适配器之queue队列
目录 适配器之队列 一丶队列简介 二丶队列(queue)代码操作 1.常用方法 适配器之队列 一丶队列简介 队列是先进先出的数据结构. 在STL中使用 queue表示. 底层使用的是序列容器deque ...
- C++STL模板库适配器之stack容器
目录 适配器 一丶适配器简介 二丶栈(stack)用法 1.栈的常用方法 适配器 一丶适配器简介 Stl中的适配器,有栈 (stack) 队列 queue 根priority_queue 适配器都是包 ...
- C++STL模板库序列容器之List容器
目录 一丶List容器的存储结构 二丶丶STL中list容器的使用. 一丶List容器的存储结构 list容器底层是链表结构来维护的.跟vector不一样. vector是数组维护的.拥有连续内存.所 ...
- iBinary C++STL模板库关联容器之map/multimap
目录 一丶关联容器map/multimap 容器 二丶代码例子 1.map的三种插入数据的方法 3.map集合的遍历 4.验证map集合数据是否插入成功 5.map数据的查找 6.Map集合删除元素以 ...
- C++STL模板库关联容器之set/multiset
目录 一丶关联容器简介.set/multiset 二丶演示代码. 一丶关联容器简介.set/multiset 我们的序列容器,底层都是线性表构成的. 比如 vector list deque. 关联容 ...
- C++STL模板库序列容器之deque
目录 一丶队列容器deque简介 二丶使用代码演示 一丶队列容器deque简介 deque底层跟vector一样,都是数组维护.不同的是可以操作头部. 二丶使用代码演示 #define _CRT_SE ...
随机推荐
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- ZOJ - 3471 Most Powerful (状态压缩)
题目大意:有n种原子,两种原子相碰撞的话就会产生能量,当中的一种原子会消失. 问这n种原子能产生的能量最大是多少 解题思路:用0表示该原子还没消失.1表示该原子已经消失.那么就能够得到状态转移方程了 ...
- linux用户进程分析
经过实验3的介绍.我们须要来点实在的.所以将我们理解的流程用于linux系统的分析.换句话说.通过类比的方式去进行描写叙述与理解linux相关的部分. 本节的内容非常详实.并且也分析 ...
- msyql索引详解
一.mysql查询表索引命令两种形式 1.mysql>SHOW INDEX FROM 'biaoming' 2.mysql>SHOW keys FROM 'biaoming' 运行结果如下 ...
- ios之UILabel实现文本自适应方法
UILabel实现文本自适应方法(ios7) - (void)initUserInterface { UILabel *label = [[UILabel alloc]init]; label.num ...
- jquery 页面滚动tab自动定位,tab与内容对应
直接上源码,基于jquery写的,可以直接跑起来. 原理是先计算出页面元素对应的高度.页面滚动时计算tab对应的高端区间,设置具体的tab.欢迎指正 下载地址 <!DOCTYPE html> ...
- yispider 开源小说採集器 (来源http://git.oschina.net/yispider/yispider 我的改动版由于他的我无法跑)
我的git地址 http://git.oschina.net/yangdc/yispider 小说採集器 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/ ...
- Java的Graphics中drawImage与drawLine的坐标区别
drawImage复制的区域是 dx1 <= x < dx2,dy1 <= y < dy2 drawLine绘制区域是 dx1 <= x <= dx2,dy1 &l ...
- Java 反射 —— 运行时的类型信息
1. 反射机制的由来 RTTI 机制可以告知某个对象的确切类型,但有一个前提,该类型在编译时必须已知(编译器在编译时打开和检查 .class 文件以获取类型信息).似乎是个很宽松的限制,但假如你获取了 ...
- 牛客网9.9比赛 C 保护
题目大意: n个城市构成一个树 m支军队 每只军队守卫 在xi到yi的最短路径上的城市 q个重要人物从vi出发 找到离根最近的点使从vi到这个点上所有路径都可以被至少ki个军队完全覆盖 输出每个答案的 ...