C++STL简介
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 将排序结果输出到标准输出设备 for (int i = 0; i < num.size(); i ++) cout << num[i] << "\n";
}
C++STL简介
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; void main(void) { typedef vector<int> int_vector; typedef istream_iterator<int> istream_itr; typedef ostream_iterator<int> ostream_itr; typedef back_insert_iterator< int_vector > back_ins_itr; // STL中的vector容器 int_vector num; // 从标准输入设备读入整数, // 直到输入的是非整型数据为止 copy(istream_itr(cin), istream_itr(), back_ins_itr(num)); // STL中的排序算法 sort(num.begin(), num.end()); // 将排序结果输出到标准输出设备 copy(num.begin(), num.end(), ostream_itr(cout, "\n")); }
STL 六大组件
适配器(adapter)
适配器是一种接口类,可以认为是标准组件的改装。通过修改其它类 的接口,使适配器满足一定需求,可分为容器适配器、迭代器适配器 和函数对象适配器三种。
分配器(allocator)
分配器是STL提供的一种内存管理类模块。每种STL容器都是用了一种 分配器类,用来封装程序所用的内存分配模式的信息。不同的内存分 配模式采用不同的方法从 操作系统中检索内存。分配器类可以封装许 多方面的信息,包括指针、常量指针、引用、常量引用、对象大小、 不同类型指针之间的差别、分配函数与释放函数、以及一些函数的信 息。分配器上的所有操作都具有分摊常量的运行时间。
C++STL简介
#include <iostream> #include <vector> #include <algorithm> using namespace std; void main(void) { vector<int> num; // STL中的vector容器 int element; // 从标准输入设备读入整数, // 直到输入的是非整型数据为止 while (cin >> element) num.push_back(element); // STL中的排序算法 sort(num.begin(), num.end());
#include <iostream> template <class T> T min(T a[],int n) { int i; T minv=a[0]; for( i = 1;i < n ; i++){ if(minv>a[i]) minv=a[i]; } return minv; }
Fra Baidu bibliotek
<<min(a,9)<< endl;
C++STL简介
STL 六大组件
容器
容器是存放其他对象的对象。比如我们常见的C++内置数组,从广义上 讲也属于一种容器。容器可以存放同一种类型的一组元素或对象,称为 同类容器类(homogenous constainer);或者存放不同类型的的元素或 对象时,称为异类容器类(heterogenous constainer)。对于STL容器 库,其包含了两类容器,一种为顺序容器(sequence contsainer),另 一种为关联容器(associative container)。
迭代器
在C++中,我们经常使用指针。而迭代器就是相当于指针,它提供了一 种一般化的方法使得C++程序能够访问不同数据类型的顺序或者关联容 器中的每一个元素,我们可以称它为“泛型指针”。 STL定义了五种迭代器类型,前向迭代器(forward iterator),双向迭代 器(bidirectional iterator),输入迭代器(input iterator),输出迭代器(output iterator),随机访问迭代器(random access iterator)。
C++STL简介
容器概述 C++STL
中 的 容 器
对象被插入容器中时,被插入的是对 象的一个复制品。 许多算法,比如排序,查找,要求对 容器中的元素进行比较,所以,放入 容器的对象所属的类,还应该实现 == 和 < 运算符。
C++STL简介
顺序容器简介
1) vector 头文件 <vector>
// 从标准输入设备读入整数,同时累计输入个数, // 直到输入的是非整型数据为止 int n; for (n = 0; cin >> num[n]; n ++); // 比较两个数的大小,
// C标准库中的快速排序(quick-sort)函数 qsort(num, n, sizeof(int), compare);
实际上就是个动态数组。随机存取任何元素都能在常数时 间完成。在尾端增删元素具有较佳的性能。
2) deque 头文件 <deque>
也是个动态数组,随机存取任何元素都能在常数时间完成 (但性能次于vector)。在两端增删元素具有较佳的性能。
3) list
头文件 <list>
双向链表,在任何位置增删元素都能在常数时间完成。不 支持随机存取。 上述三种容器称为顺序容器,是因为元素的插入位置同元 素的值无关。
内容
向量 双头队列 链表 集合与多重集合 映射与多重映射 栈 队列与优先队列
C++STL简介
STL 六大组件
容器(Container) 迭代器(Iterator) 算法(Algorithm) 仿函数(Function object) 适配器(Adaptor) 分配器 (allocator)
C++STL简介
C++模板
函数模板(function template)
– 是独立于类型的函数 – 可产生函数的特定版本
类模板(class template)
– 跟类相关的模板,如vector – 可产生类对特定类型的版本,如 vector<int>
5
C++STL简介
求最大值模板函数实现
1.求两个数最大值,使用模板 template < class T > T max(T a , T b){ return ( a > b ) ? a , b; } 2.template < 模板形参表> <返回值类型> <函数名>(模板函数形参表) { //函数定义体 }
// 将排序结果输出到标准输出设备 for (int i = 0; i < n; i ++) cout << num[i] << "\n"; }
// 如果*(int *)arg1比*(int *)arg2小,则返回-1 // 如果*(int *)arg1比*(int *)arg2大,则返回1 // 如果*(int *)arg1等于*(int *)arg2,则返回0 int compare(const void *arg1, const void *arg2) { return (*(int *)arg1 < *(int *)arg2) ? 1: (*(int *)arg1 > *(int *)arg2) ? 1 : 0; }
C++STL简介
STL概述
一个具有工业强度的,高效的C++程序库。 它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是 极具革命性的一部分。 该库包含了诸多在计算机科学领域里所常用的基 本数据结构和基本算法。 为广大C++程序员们提供了一个可扩展的应用框架 ,高度体现了软件的可复用性 有了STL,不必再从头写大多的标准数据结构和算 法,并且可获得非常高的性能。
6
C++STL简介
模板例子: 编写一个对具有n个元素的数组a[ ]求最小值的 程序,要求将求最小值的函数设计成函数模板。
void main() { ina a[]={1,3,0,2,7,6,4,5,2}; double b[]={1.2,-3.4,6.8,9,8}; cout<<”a数组的最小值为:”
8
C++STL简介
引例
大致功能是:从标准输入设备(一般是键盘)读 入一些整型数据,然后对它们进行排序,最终将 结果输出到标准输出设备(一般是显示器屏幕)
C++STL简介
int compare(const void *arg1, const void *arg2); void main(void) { const int max_size = 10; // 数组允许元素的最大个数 int num[max_size]; // 整型数组
cout<<”b数组的最小值为:” <<min(b,4)<<endl; } 此程序的运行结果为: a数组的最小值为:0
b数组的最小值为:-3.4
C++STL简介
模板优缺点
函数模板方法克服了C语言解决上述问题时用大 量不同函数名表示相似功能的坏习惯 克服了宏定义不能进行参数类型检查的弊端 克服了C++函数重载用相同函数名字重写几个函 数的繁琐 缺点,调试比较困难 – 一般先写一个特殊版本的函数 – 运行正确后,改成模板函数
C++ STL简介
Standard Template Library
C++STL简介
主要内容
STL概述
容器
迭代器
算法
函数对象
2
C++STL简介
STL概述
STL就是建立在模板函数和模板类基 础之上的功能强大的库
– 模板函数可以实现一般化的常用算法( 如统计、排序、查找等) – 模板类可以实现支持几乎所有类型的容 器,用来实现常用的数据结构(如链表 、栈、队列、平衡二叉树等)
17
C++STL简介
主要内容
STL概述
容器
迭代器
算法
函数对象
18
C++STL简介
容器概述 C++STL
中 的 容 器
可以用于存放各种类型的数据(基本类型的变量,对象等)的数 据结构。 容器分为三大类: 1) 顺序容器 vector:后部插入/删除,直接访问 deque:前/后部插入/删除,直接访问 list:双向链表,任意位置插入/删除 2)关联容器 set:快速查找,无重复元素 multiset :快速查找,可有重复元素 map:一对一映射,无重复元素,基于关键字查找 multimap :一对一映射,可有重复元素,基于关键字查找 前2者合称为第一类容器 3)容器适配器 stack:LIFO queue:FIFO priority_queue:优先级高的元素先出
C++STL简介
STL头文件一览
头文件
<iterator> <utility> <memory> <algorithm> <functional> <numeric>
内容
迭代器 辅助功能 内存管理 算法 函数对象 数值运算
头文件
<vector> <deque> <list> <set> <map> <stack> <queue>
仿函数:函数对象
函数对象是STL提供的四种组件中的一种,它是定义了操作符 operator( )的对象。在C++中,除了定义了操作符operator( )的对象之 外,普通函数或者函数指针也满足函数对象的特征。结合函数模板的 使用,函数对象使得STL更加灵活和方便,同时也使得代码更为高效 。
16
C++STL简介
15
C++STL简介
STL 六大组件
算法
算法是STL中的核心,它它包含了70多个通用算法。可以分为四类: 不可变序列算法(non-modifying sequence algorithms)、可变序列 算法(mutating sequence algorithms)、排序及相关算法(sorting and related algorithms)和算术算法(numeric algorithms)。