Part10 泛型程序设计与C++标准模板库 10.1泛型程序设计及STL的结构
1泛型程序设计的基本概念
泛型程序设计:
编写不依赖于具体数据类型的程序
将算法从特定的数据结构中抽象出来,成为通用的
C++的模板为泛型程序设计奠定了关键的基础
术语:概念
用来界定具备一定功能的数据类型。例如:
将“可以比大小的所有数据类型(有比较运算符)”这一概念记为Comparable
将“具有公有的复制构造函数并可以用‘=’赋值的数据类型”这一概念记为Assignable
将“可以比大小、具有公有的复制构造函数并可以用‘=’赋值的所有数据类型”这个概念记作Sortable
对于两个不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能,那么就说概念B是概念A的子概念。例如:
Sortable既是Comparable的子概念,也是Assignable的子概念
术语:模型
模型(model):符合一个概念的数据类型称为该概念的模型,例如:
int型是Comparable概念的模型。
静态数组类型不是Assignable概念的模型(无法用“=”给整个静态数组赋值)
2STL简介
标准模板库(Standard Template Library,简称STL)定义了一套概念体系,为泛型程序设计提供了逻辑基础
STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的。
使用STL的模板时,类型参数既可以是C++标准库中已有的类型,也可以是自定义的类型——只要这些类型是所要求概念的模型。
STL的基本组件:容器、迭代器、函数对象、算法
Iterators(迭代器)是算法和容器的桥梁。
将迭代器作为算法的参数、通过迭代器来访问容器而不是把容器直接作为算法的参数。
将函数对象作为算法的参数而不是将函数所执行的运算作为算法的一部分。
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-1STL程序实例,从标准输入读入几个整数,存入向量容器,输出它们的相反数 #include<iostream> #include<vector> #include<iterator> #include<algorithm> #include<functional> using namespace std; int main(){const int N = 5;vector<int> s(N);//容器for(int i = 0; i < N; i++)cin >> s[i];transform(s.begin(),s.end(),ostream_iterator<int>(cout," "), negate<int>());cout << endl;return 0; } //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会将该迭代器返回
转载于:https://www.cnblogs.com/leosirius/p/8127731.html
Part10 泛型程序设计与C++标准模板库 10.1泛型程序设计及STL的结构相关推荐
- 8、泛型程序设计与c++标准模板库2.4列表容器
列表容器主要用于存放链表,其中的链表是双向链表,可以从任意一端开始遍历.列表容器是需要按顺序访问的容器.另外,列表容器不支持随机访问迭代器,因此某些算法不能适合于列表容器.列表容器还提供了另一种操作- ...
- C++的STL标准模板库思维导图
STL标准模板库思维导图 C++ 语言的核心优势之一就是便于软件的重用.C++ 中有两个方面体现重用: 一是面向对象的继承和多态机制: 二是通过模板的概念实现了对泛型程序设计的支持. C++ 的标准模 ...
- C++中标准模板库STL基本概念
0. 前言 C++语言的一大优势就是便于软件的重用,而重用体现在两方面: 1. 面向对象思想:继承和多态,标准类库 2. 泛程序设计(Generic Programming)思想:模板机制,标准模板库 ...
- 标准模板库(STL)
STL 标准模板库(Standard Template Library,STL)是一个基于模板的容器类库.可用STL创建一个类,为任意数据类型定义矢量.链表.队列和栈等操作.STL中的泛型算法(gen ...
- 轻松上手C++的标准模板库的使用
文章目录 简介 容器分类 迭代器 向量容器--vector(顺序容器) 向量容器的特性 向量容器的常用方法 向量容器的遍历 string 字符串(顺序容器) string 字符串的声明 string的 ...
- 标准模板库STL经典书籍(必读)
简体中文 C++ STL中文版(PDF) 9467 KB ★★★★ 2008-2-14 简体中文 STL源码剖析(PDF) 11493 KB ★★★★ 2006 ...
- STL 标准模板库详细
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- C++ STL 标准模板库
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- 轻轻松松学习C++ 标准模板库STL
作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机 ...
最新文章
- Pytorch笔记(python--类与对象(class and module))
- 关于ORACLE RAC心跳问题的释疑
- 一些可运行的C语言数据结构代码
- 【Python】字符串类型及操作求三位水仙花数
- 图谱实战 | 面向C端场景的概念图谱构成、建设与应用索引
- dlib+vs2013+opencv实现人脸特征点检测
- 第二篇 Python图片处理模块PIL(pillow)
- java锁对象的区别吗_Java中对象级别锁和类级别锁之间的区别
- matlab模拟退火最小球覆盖,【模板】模拟退火 费马点以及最小球覆盖
- MySQL日期处理函数实现博客按年月份进行分组
- mysql timestamp 默认值是什么#039;_MYSQL中TIMESTAMP类型的默认值
- ABP官方文档翻译 1.2 N层架构
- ZOJ 3987 2017CCPC秦皇岛 G:Numbers(高精度+贪心)
- 开源API网关系统:Kong简介
- 树莓派python界面编程_树莓派PythonGUI学习
- 测绘——利用ExifTool提取照片exif信息【windows环境下】(信息非常全)
- iOS安全攻防(二十):越狱检测的攻与防
- Java抽象画--秒变绘图大师
- Android基于腾讯云的视频聊天研究
- 阿里云后台测试短信模板
热门文章
- Java中读取某个目录下的所有文件和文件夹
- JNDI数据库连接池的配置
- 浅谈 PHP 神盾的解密过程
- SQL查询语句大全集锦(一)
- 删除数据 DataIntegrityViolationException: not-null property references a null or transient value解决...
- linux性能优化实战-内存性能指标
- vue之Render函数
- junit 单元测试 - 参数化测试
- Ubuntu Linux 安装 .7z 解压和压缩文件
- 【转】【C#】无边框窗体移动的三种方法